图片-小白之家
图片-小白之家
图片-小白之家
图片-小白之家

oracle函数(oracle函数怎么写)

在oracle中,函数又被称PL/SQL子程序,是作为数据库对象存储在oracle数据库中的;函数会对传递进来的参数进行处理,并回来一个处理结果,也就是回来一个值。oracle函数可分为两类:体系函数和用户自界说函数。

本教程操作环境:Windows7体系、Oracle11g版、DellG3电脑。

Oracle函数的界说

函数是作为数据库对象存储在oracle数据库中,函数又被称为PL/SQL子程序。

函数会对传递进来的参数进行处理,并回来一个处理结果,也就是回来一个值。一般用于回来特定的数据。

oracle函数可分为两类:体系函数和用户自界说函数。
图片[1]-oracle函数(oracle函数怎么写)-小白之家,oracle函数怎么写,–创建表

DECLARE

CNTINTEGER;

BEGIN

SELECTCOUNT(0)

INTOCNT

FROMUSER_ALL_TABLES

WHERETABLE_NAME=’CMSTEMP’;

IFCNT=0THEN

EXECUTEIMMEDIATE’CREATETABLECMSTEMP(

IDINTEGERPRIMARYKEY,

NAMEVARCHAR2(32),

AGEINTEGER,

ADDRESSVARCHAR2(64)

)’;

ENDIF;

END;

–创建type

DECLARE

CNTINTEGER;

BEGIN

SELECTCOUNT(0)INTOCNTFROMUSER_TYPESWHERETYPE_NAME=’CMSTEMPTYPE’;

IFCNT=0THEN

EXECUTEIMMEDIATE’CREATEORREPLACETYPECMSTEMPTYPEASOBJECT(

IDINTEGER,

NAMEVARCHAR2(32),

AGEINTEGER,

ADDRESSVARCHAR2(64)

)’;

ENDIF;

END;

–创建type表

DECLARE

CNTINTEGER;

BEGIN

SELECTCOUNT(0)INTOCNTFROMUSER_TYPESWHERETYPE_NAME=’CMSTEMPTYPETABLE’;

IFCNT=0THEN

EXECUTEIMMEDIATE’

CREATEORREPLACETYPECMSTEMPTYPETABLEASTABLEOFCMSTEMPTYPE’;

ENDIF;

END;

–创建临时表

DECLARE

CNTINTEGER;

BEGIN

SELECTCOUNT(0)

INTOCNT

FROMUSER_ALL_TABLES

WHERETABLE_NAME=’CMSTEMPGLO’;

IFCNT=0THEN

EXECUTEIMMEDIATE’CREATEGLOBALTEMPORARYTABLECMSTEMPGLO(

IDINTEGERPRIMARYKEY,

NAMEVARCHAR2(32),

AGEINTEGER,

ADDRESSVARCHAR2(64)

)

ONCOMMITPRESERVEROWS’;

ENDIF;

END;

–创建包

CREATEORREPLACEPACKAGEGLOBALPACKGE

AS

TYPECUR1ISREFCURSOR;

END;

第一种方式使用临时表

CREATEORREPLACEFUNCTIONNS_CMS_GETCMSTEM(NAMEVARCHAR2)

RETURNCMSTEMPTYPETABLE

PIPELINEDIS

PRAGMAAUTONOMOUS_TRANSACTION;

V_NAMEVARCHAR2(32);

V_AGEINTEGER;

V_ADDRESSVARCHAR2(64);

V_IDINTEGER;

RWSCMSTEMPTYPE:=CMSTEMPTYPE(NULL,NULL,NULL,NULL);

V_CURGLOBALPACKGE.CUR1;

BEGIN

EXECUTEIMMEDIATE’TRUNCATETABLECMSTEMPGLO’;

FORRECIN(SELECT*FROMCMSTEMP)LOOP

V_NAME:=REC.NAME;

V_AGE:=REC.AGE;

V_ID:=REC.ID;

V_ADDRESS:=REC.ADDRESS;

INSERTINTOCMSTEMPGLO

(ID,ADDRESS,AGE,NAME)

VALUES

(V_ID,V_ADDRESS,V_AGE,V_NAME);

DBMS_OUTPUT.PUT_LINE(‘11111111111’);

ENDLOOP;

COMMIT;

OPENV_CURFOR

SELECT*FROMCMSTEMPGLO;

LOOP

FETCHV_CUR

INTORWS.ID,RWS.NAME,RWS.AGE,RWS.ADDRESS;

EXITWHENV_CUR%NOTFOUND;

PIPEROW(RWS);

ENDLOOP;

CLOSEV_CUR;

END;

第二种方式不适用临时表

CREATEORREPLACEFUNCTIONNS_CMS_GETCMSTEMP(NAMEVARCHAR2)

RETURNCMSTEMPTYPETABLE

PIPELINEDAS

PRAGMAAUTONOMOUS_TRANSACTION;

V_CURGLOBALPACKGE.CUR1;

V_NAMEVARCHAR2(32);

V_ADDRESSVARCHAR2(64);

V_AGEINTEGER;

V_IDINTEGER;

RET_ROWCMSTEMPTYPE:=CMSTEMPTYPE(NULL,NULL,NULL,NULL);

RET_TABLECMSTEMPTYPETABLE:=CMSTEMPTYPETABLE();–这里必须这样写

BEGIN

FORRECIN(SELECT*FROMCMSTEMP)LOOP

RET_TABLE.EXTEND;

RET_ROW.ID:=REC.ID;

RET_ROW.AGE:=REC.AGE;

RET_ROW.NAME:=REC.NAME;

RET_ROW.ADDRESS:=REC.ADDRESS;

RET_TABLE(RET_TABLE.COUNT):=RET_ROW;

ENDLOOP;

COMMIT;

openV_CURfor

select*fromtable(RET_TABLE);

loop

fetchV_CURintoRET_ROW.ID,RET_ROW.NAME,RET_ROW.AGE,RET_ROW.ADDRESS;–顺序要和type对象里定义的顺序保持一致

exitwhenV_CUR%notfound;

piperow(RET_ROW);

endloop;

closev_cur;

END;

插入数据

iinteger;

begin

foriin1..100loop

insertintocmstempvalues(i,’zhangsan’||i,1+i,’王府大街’||i);

commit;

endloop;

end;

查询sql

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容

图片-小白之家
图片-小白之家