关于createtype的信息
帮忙翻译几句 oracle 语言?
su - oracle -- 切换到oracle用户
sqlplus / as sysdba --用sysdba登录sqlplus
create or replace directory SP1UPD860 as '/oradata/oradbbak820'; --创建目录SP1UPD860,实际指向/oradata/oradbbak820
grant read,write on directory SP1UPD860 to system; --给system用户对该目录授权读写权限
create tablespace EAS_D_SP1UPD860_STANDARD DATAFILE '/oradata/oradata/SP1UPD860/EAS_D_SP1UPD860_STANDARD.DBF' size 1000M reuse autoextend on next 100M maxsize unlimited;
--创建表空间EAS_D_SP1UPD860_STANDARD,数据文件DATAFILE的大小为100M,可无限扩展
create temporary tablespace EAS_T_SP1UPD860_STANDARD tempfile '/oradata/oradata/SP1UPD860/EAS_T_SP1UPD860_STANDARD.ORA' size 100M reuse autoextend on next 100M maxsize unlimited;
--创建临时表空间EAS_T_SP1UPD860_STANDARD
create user SP1UPD860 identified by eas860 default tablespace EAS_D_SP1UPD860_STANDARD temporary tablespace EAS_T_SP1UPD860_STANDARD quota unlimited on EAS_D_SP1UPD860_STANDARD;
--创建用户SP1UPD860,指定密码为eas860,默认表空间为EAS_D_SP1UPD860_STANDARD,临时表空间为EAS_T_SP1UPD860_STANDARD,表空间配额无限制
grant create type,create session,create materialized view,create table,create procedure,create sequence,create trigger,create view,SELECT ANY DICTIONARY to SP1UPD860;
--对用户SP1UPD860授权
impdp system/Kingdee6666 directory=SP1UPD860 dumpfile=EASNEW82020160623.DMP logfile=SP1UPD86020200804.LOG EXCLUDE="TABLE:LIKE'VT%'" EXCLUDE=STATISTICS PARALLEL=4 REMAP_SCHEMA=EASNEW820:SP1UPD860 REMAP_TABLESPACE=EAS_D_EASNEW820_STANDARD:EAS_D_SP1UPD860_STANDARD,EAS_T_EASNEW820_STANDARD:EAS_T_SP1UPD860_STANDARD
--导出文件EASNEW82020160623.DMP
c#变量名怎么递增
建议使用数组和集合来代替递增的变量名。
public?int?a[]?=?new?int[5];
public?SortedListint,?int?b?=?new?SortedListint,?int();
a[1]?=?123;
b.Add(1,?123);
b[1]?=?456;
如果非要实现以动态递增的形式创建指定变量名的对象,需要用到动态类型。
动态创建变量应该是下面两个类负责。
字段:System.Reflection.Emit.FieldBuilder(定义并表示字段。无法继承此类)
局部变量:System.Reflection.Emit.LocalBuilder(表示方法或构造函数内的局部变量)
下面是动态创建类Class的参考代码
????????public?static?Type?DynamicCreateType()?{
????????????//动态创建程序集??
????????????AssemblyName?DemoName?=?new?AssemblyName("DynamicAssembly");
????????????AssemblyBuilder?dynamicAssembly?=?AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName,?AssemblyBuilderAccess.RunAndSave);
????????????//动态创建模块??
????????????ModuleBuilder?mb?=?dynamicAssembly.DefineDynamicModule(DemoName.Name,?DemoName.Name?+?".dll");
????????????//动态创建类MyClass??
????????????TypeBuilder?tb?=?mb.DefineType("MyClass",?TypeAttributes.Public);
????????????//动态创建字段??
????????????FieldBuilder?fb?=?tb.DefineField("myField",?typeof(System.String),?FieldAttributes.Private);
????????????//动态创建构造函数??
????????????Type[]?clorType?=?new?Type[]?{?typeof(System.String)?};
????????????ConstructorBuilder?cb1?=?tb.DefineConstructor(MethodAttributes.Public,?CallingConventions.Standard,?clorType);
????????????//生成指令??
????????????ILGenerator?ilg?=?cb1.GetILGenerator();//生成?Microsoft?中间语言?(MSIL)?指令??
????????????ilg.Emit(OpCodes.Ldarg_0);
????????????ilg.Emit(OpCodes.Call,?typeof(object).GetConstructor(Type.EmptyTypes));
????????????ilg.Emit(OpCodes.Ldarg_0);
????????????ilg.Emit(OpCodes.Ldarg_1);
????????????ilg.Emit(OpCodes.Stfld,?fb);
????????????ilg.Emit(OpCodes.Ret);
????????????//动态创建属性??
????????????PropertyBuilder?pb?=?tb.DefineProperty("MyProperty",?PropertyAttributes.HasDefault,?typeof(string),?null);
????????????//动态创建方法??
????????????MethodAttributes?getSetAttr?=?MethodAttributes.Public?|?MethodAttributes.SpecialName;
????????????MethodBuilder?myMethod?=?tb.DefineMethod("get_Field",?getSetAttr,?typeof(string),?Type.EmptyTypes);
????????????//生成指令??
????????????ILGenerator?numberGetIL?=?myMethod.GetILGenerator();
????????????numberGetIL.Emit(OpCodes.Ldarg_0);
????????????numberGetIL.Emit(OpCodes.Ldfld,?fb);
????????????numberGetIL.Emit(OpCodes.Ret);
????????????//使用动态类创建类型??
????????????Type?classType?=?tb.CreateType();
????????????//保存动态创建的程序集?(程序集将保存在程序目录下调试时就在Debug下)??
????????????dynamicAssembly.Save(DemoName.Name?+?".dll");
????????????//创建类??
????????????return?classType;
????????}
如何动态创建一个泛型类型的对象
使用Emit技术可以实现动态创建泛型或非泛型类型:
static?void?DynamicGenericWithEmit(){
????????????AppDomain?myDomain?=?AppDomain.CurrentDomain;
????????????var?am?=?new?AssemblyName("Dynamic");
????????????//?定义动态程序集
????????????AssemblyBuilder?ab?=?myDomain.DefineDynamicAssembly(am,?AssemblyBuilderAccess.RunAndSave);
????????????//?定义动态模块
????????????ModuleBuilder?mb?=?ab.DefineDynamicModule("Dynamic",?am.Name?+?".dll");
????????????//?定义类型
????????????TypeBuilder?tb?=?mb.DefineType("App",?TypeAttributes.Public);
????????????//?定义泛型类型参数
????????????GenericTypeParameterBuilder[]?typeParams?=?tb.DefineGenericParameters("T");
????????????GenericTypeParameterBuilder?T?=?typeParams[0];
????????????//?设置泛型类型约束
????????????T.SetGenericParameterAttributes(GenericParameterAttributes.DefaultConstructorConstraint?|?GenericParameterAttributes.ReferenceTypeConstraint);
????????????//?构造私有字段
????????????FieldBuilder?fb?=?tb.DefineField("_foo",?T,?FieldAttributes.Private);
????????????MethodBuilder?method?=?tb.DefineMethod("Bar",?MethodAttributes.Public);
????????????//?直接使用IL指令流进行封送
????????????ILGenerator?ilGen?=?method.GetILGenerator();?//?获取方法的MSIL中间语言生成器
????????????ilGen.Emit(OpCodes.Ldarg_0);?//?向IL加载索引为0的参数到托管堆栈里并存入指令流
????????????ilGen.Emit(OpCodes.Ret);?????//?如果存在返回值就将值推送到堆栈里并存入指令流
????????????tb.CreateType();?????????????//?创建该类型
????????????ab.Save(am.Name?+?".dll");???//?保存到bin目录
?}
通过上面的操作后,形成IL中间语言,然后再使用反编译工具,查看Dynamic.dll,可以看到它的原型如下:
//?App是上面定义的类名,T是泛型类型参数,且约束于引用类型class,且存在公共的
//?无参的构造函数,其它,如字段,方法同上。
public?class?AppT?where?T?:?class,?new()
{
????private?T?_foo;
????public?void?Bar()
????{
????????this;
????}
}
ASP操作Excel的方法
代码如下:
%
'*******************************************************************
'使用说明
'Dim
a
'Set
a=new
CreateExcel
'a.SavePath=x
'保存路径
'a.SheetName=工作簿名称
'多个工作表
a.SheetName=array(工作簿名称一,工作簿名称二)
'a.SheetTitle=表名称
'可以为空
多个工作表
a.SheetName=array(表名称一,表名称二)
'a.Data
=d
'二维数组
'多个工作表
array(b,c)
b与c为二维数组
'Dim
rs
'Set
rs=server.CreateObject(Adodb.RecordSet)
'rs.open
Select
id,
classid,
className
from
[class]
,conn,
1,
1
'a.AddDBData
rs,
字段名一,字段名二,
工作簿名称,
表名称,
true
'true自动获取表字段名
'a.AddData
c,
true
,
工作簿名称,
表名称
'c二维数组
true
第一行是否为标题行
'a.AddtData
e,
Sheet1
'按模板生成
c=array(array(AA1,
内容),
array(AA2,
内容2))
'a.Create()
'a.UsedTime
生成时间,毫秒数
'a.SavePath
保存路径
'Set
a=nothing
'设置COM组件的操作权限。在命令行键入DCOMCNFG,则进入COM组件配置界面,选择MicrosoftExcel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限
'*******************************************************************
Class
CreateExcel
Private
CreateType_
Private
savePath_
Private
readPath_
Private
AuthorStr
Rem
设置作者
Private
VersionStr
Rem
设置版本
Private
SystemStr
Rem
设置系统名称
Private
SheetName_
Rem
设置表名
Private
SheetTitle_
Rem
设置标题
Private
ExcelData
Rem
设置表数据
Private
ExcelApp
Rem
Excel.Application
Private
ExcelBook
Private
ExcelSheets
Private
UsedTime_
Rem
使用的时间
Public
TitleFirstLine
Rem
首行是否标题
Private
Sub
Class_Initialize()
Server.ScriptTimeOut
=
99999
UsedTime_
=
Timer
SystemStr
=
Lc00_CreateExcelServer
AuthorStr
=
Surnfu[emailprotected]
31333716
VersionStr
=
1.0
if
not
IsObjInstalled(Excel.Application)
then
InErr(服务器未安装Excel.Application控件)
end
if
set
ExcelApp
=
createObject(Excel.Application)
ExcelApp.DisplayAlerts
=
false
ExcelApp.Application.Visible
=
false
CreateType_
=
1
readPath_
=
null
End
Sub
Private
Sub
Class_Terminate()
ExcelApp.Quit
If
Isobject(ExcelSheets)
Then
Set
ExcelSheets
=
Nothing
If
Isobject(ExcelBook)
Then
Set
ExcelBook
=
Nothing
If
Isobject(ExcelApp)
Then
Set
ExcelApp
=
Nothing
End
Sub
Public
Property
Let
ReadPath(ByVal
Val)
If
Instr(Val,
:)0
Then
readPath_
=
Trim(Val)
else
readPath_=Server.MapPath(Trim(Val))
end
if
End
Property
Public
Property
Let
SavePath(ByVal
Val)
If
Instr(Val,
:)0
Then
savePath_
=
Trim(Val)
else
savePath_=Server.MapPath(Trim(Val))
end
if
End
Property
Public
Property
Let
CreateType(ByVal
Val)
if
Val
1
and
Val
2
then
CreateType_
=
1
else
CreateType_
=
Val
end
if
End
Property
Public
Property
Let
Data(ByVal
Val)
if
not
isArray(Val)
then
InErr(表数据设置有误)
end
if
ExcelData
=
Val
End
Property
Public
Property
Get
SavePath()
SavePath
=
savePath_
End
Property
Public
Property
Get
UsedTime()
UsedTime
=
UsedTime_
End
Property
Public
Property
Let
SheetName(ByVal
Val)
if
not
isArray(Val)
then
if
Val
=
then
InErr(表名设置有误)
end
if
TitleFirstLine
=
true
else
ReDim
TitleFirstLine(Ubound(Val))
Dim
ik_
For
ik_
=
to
Ubound(Val)
TitleFirstLine(ik_)
=
true
Next
end
if
SheetName_
=
Val
End
Property
Public
Property
Let
SheetTitle(ByVal
Val)
if
not
isArray(Val)
then
if
Val
=
then
InErr(表标题设置有误)
end
if
end
if
SheetTitle_
=
Val
End
Property
Rem
检查数据
Private
Sub
CheckData()
if
savePath_
=
then
InErr(保存路径不能为空)
if
not
isArray(SheetName_)
then
IIS报错Parser Error Message: Could not create type'GSafety.TrainingDrill.DataWebService.Service1'.
原因:1) 没有向iis中注册.net framework(引起的原因之一:先安装了.net framework,后安装的iis)
2) 没有对IIS中所配置的site有足够的操作权限(Modify权限)
解决方案:
1) 到C:\Windows\Microsoft.NET\Framework64\v2.0.50727下,
用命令向iis中重新注册一下.net framework:aspnet_regiis -i
2) IIS Manager -- Sites -- 相应的site -- 点击右键 -- Edit Permissions -- Security -- Group or user names -- Edit -- Add -- 添加赋予Full Control权限(实质上带有Modify的权限就可以)的Everyone用户
Postgres-存储过程 return 详解
如果返回一个 数字或者字符 比较简单,那么多行多列怎么办呢,分为以下几种情况【东西很多,这里只做简单列举】
返回多行单列
又分为几种方式
1. return next,用在 for 循环中
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOFvarcharas $$DECLARE? ? v_name varchar;BEGINforv_namein( (selectnamefromtest_result1whereid=in_id)union(selectnamefromtest_result2whereid= in_id) ) loop
? ? RETURNNEXT v_name;
? end loop;
? return;END;
$$
LANGUAGE PLPGSQL;
注意
1. 循环外还有个 return
2. 需要实现声明 v_name
2. return query,无需 for 循环
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOFvarcharas $$DECLARE? ? v_rec RECORD;BEGINreturnquery? ( (selectnamefromtest_result1whereid=in_id)union(selectnamefromtest_result2whereid= in_id) );
? return;END;$$LANGUAGE PLPGSQL;
注意:如果 返回类型为 setof,最好用如下方法
RETURNQUERYEXECUTESQL
不要这么用
executesqlinto? out;returnout;
返回多行多列
也有多种方式
1. 使用 return next 和? setof record ,需要 for 循环
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOF RECORDas $$DECLARE? ? v_rec RECORD; BEGINforv_recin( (selectid , namefromtest_result1whereid=in_id)union(selectid , namefromtest_result2whereid= in_id) )loop
? ? RETURNNEXT v_rec;
? end loop;
? return;END;
$$
LANGUAGE PLPGSQL;
注意
1. 读取表的整行数据时才能用 record
2. 如果读取的数据不是整行,需要自定义 复合数据类型,否则会报如下错误
ERROR:? acolumndefinition listisrequiredforfunctions returning "record"
定义复合类型 ,示例如下
createtype myout2as (
road_num int,
freq bigint);createorreplacefunctiontest(cartext, time1text, time2text)returnssetof myout2as $$declare
? ? array1 text[];
? ? array2 text[];
? ? len1 integer;
? ? len2 integer;
? ? x integer;
? ? y integer;
? ? road_str text;
? ? car_str text;
? ? sql text;
? ? i myout2;
? ? begin-- vin 号拼接selectregexp_split_to_array(car,',')into array2;
? ? selectarray_length(array2,1)into len2;
? ? car_str :='';
? ? y :=1;
? ? whiley= len2 loop
? ? car_str :=car_str||quote_literal(array2[y])||',';
? ? y :=y+1;
? ? end loop;
? ? -- sql 拼接sql :='select road_number, sum(frequency) from heat_map where date_key = '''|| time1
? ? ||'-01'' and date_key ='''|| time2
? ? ||'-20'' and vin in ('||rtrim(car_str,',')
? ? ||')group by road_number;';
? ? --execute sql into out;foriinexecute sql loop
? ? returnnext i;
? ? end loop;
? ? return;end$$ language plpgsql;
在执行时可能会报如下错误
ERROR:set-valuedfunctioncalledincontext that cannot accept aset
解决方法
select funcname(arg);--改为select*fromfuncname(arg);
2.? return query,无需 for 循环
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOF RECORDas $$DECLARE? ? v_rec RECORD;BEGINreturnquery? ( (selectid , namefromtest_result1whereid=in_id)union(selectid , namefromtest_result2whereid= in_id) );
? return;END;
$$
LANGUAGE PLPGSQL;
3. 使用 out 输出参数
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger,out o_idinteger,out o_namevarchar)
RETURNSSETOF RECORDas $$DECLARE? ? v_rec RECORD;BEGINforv_recin( (selectid , namefromtest_result1whereid=in_id)union(selectid , namefromtest_result2whereid= in_id) )loop
? ? o_id? := v_rec.id;
? ? o_name := v_rec.name;
? ? RETURNNEXT ;
? end loop;
? return;END;
$$
LANGUAGE PLPGSQL;
总结 - return next return query?
我们可以看到上面无论是单列多行还是多列多行,都用到了 return next 和 return query 方法
在 plpgsql 中,如果存储过程返回 setof sometype,则返回值必须在 return next 或者 return query 中声明,然后有一个不带参数的 retrun 命令,告诉函数执行完毕;【setof 就意味着 多行】
用法如下
RETURNNEXT expression;RETURN QUERY query;RETURNQUERYEXECUTEcommand-string[ USING expression [, ... ]];
return next 可以用于标量和复合类型数据;
return query 命令将查询到的一条结果追加到函数的结果集中;
二者在单一集合返回函数中自由混合,在这种情况下,结果将被级联。【有待研究】
return query execute 是 return query 的变形,它指定 sql 将被动态执行;
returnqueryselectroad_number,sum(frequency)fromheat_mapgroupbyroad_number;--这样可以sql :='select road_number, sum(frequency) from heat_map group by road_number';returnquery sql;--这样不行
参考资料:
自定义类型并返回数组
return next return query
function返回多列多行
返回结果集多列和单列的例子??
PostgreSQL存储过程(1)-基于SQL的存储过程
动态SQL
postgresql, pgadmin error RETURN cannot have a parameter in function returning set
存储过程输出参数
PostgreSQL存储过程(3)-流程控制语句