关于createtype的信息

http://www.itjxue.com  2023-01-17 21:48  来源:未知  点击次数: 

帮忙翻译几句 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)-流程控制语句

(责任编辑:IT教学网)

更多

推荐Frontpage教程文章