CREATE [OR REPLACE] PROCEDURE [schema.] procedure_name [parameter_name] [[IN] datatype [{:=|DEFAULT} expression] | {OUT | IN OUT} [NOCOPY] datatype][,...]{IS | AS} BODY;
EXEC procedure_name;
sql
EXEC procedure_name(parameters);
数据库
SHOW SERVEROUTPUT -- 查看 SET SERVEROUTPUT ON -- 开启
CREATE PROCEDURE PRO_READER AS BEGIN UPDATE READERINFO2 SET BOOKCOUNT = BOOKCOUNT+1 WHERE UNIT = '计算机系'; END;
CREATE PROCEDURE PRO_READER_COT AS v_readerinfo READERINFO2%ROWTYPE;-- 声明标变量v_readerinfo,其数据类型为READERINFO2行记录类型 CURSOR cursor_readerinfo IS SELECT * FROM READERINFO2 WHER UNIT IN('自动化系','生物系') ORDER BY UNIT;-- 表示声明建立游标cursor_readerinfo BEGIN OPE cursor_readerinfo; --打开游标 LOOP FETCH cursor_readerinfo INTO v_readerinfo; -- 从游标中提取指针指向当前行数据,并存入标量v_readerinfo EXIT WHEN cursor_readerinfo%NOTFOUND; -- 表示进行判断,当游标指针到尾部时,将结束循环 IF v_readerinfo.bookcount < 3 THEN UPDATE READERINFO2 SET BOOKCOUNT = BOOKCOUNT+1 WHERE READERID = v_readerinfo.readerid; END IF; END LOOP; END;
CREATE PROCEDURE PRO_CRTTAB AS tabeexists VARCHAR2(2); -- 声明变量 my_createtab VARCHAR2(400); BEGIN SELECT COUNT(1) INTO tabeexists FROM ALL_TABLES WHERE TABLE_NAME = 'MY_TEST_TAB';-- 从ALL_TABLES数据字典中查询是否已经存在临时表MY_TEST_TAB,并把结果赋值给变量tabeexists my_createtab := 'CREATE GLOBAL TEMPORARY TABLE MY_TEST_TAB (TEST VARCHAR2(20) not null) ON Commit Preserve Rows';-- 表示变量my_createtab赋值建立临时表的语句 IF tabeexists = 0 THEN EXECUTE IMMEDIATE my_createtab; DBMS_OUTPUT.PUT_LINE('临时表建立成功...'); ELSE EXECUTE IMMEDIATE 'DELETE FROM MY_TEST_TAB'; DBMS_OUTPUT.PUT_LINE('记录已经删除...'); END IF; END;
使用GRANT CREATE ANY TABLE TO <USER>
为用户赋予权限express
在调用时,经过制定所须要的参数值,实现特定的功能。在建立时,还能够为参数制定默认值。存储过程一旦使用了参数,那么在执行存储过程时则要求必须为其制定参数,参数容许是常量、变量、表达式等。微信
存储过程的参数有输入、输出、输入输出3中类型。其中输入参数也是默认的参数,也叫IN类型参数。oracle
CREATE PROCEDURE PRO_READERLIST_SE(unit IN VARCHAR2, minbookcount IN NUMBER)-- 两个输入型参数 unit minbookcount AS TYPE reader_book_rc IS RECORD ( v_readerid READERINFO.READERID%TYPE, v_readername READERINFO.READERNAME%TYPE, v_unit READERINFO.UNIT%TYPE, v_bookcount READERINFO.BOOKCOUNT%TYPE, v_count_reader NUMBER(8) ); -- 声明一个记录类型的数据类型 v_readebook_rc reader_book_rc;-- 声明变量 该变量为记录类型 CURSOR cur_readebook IS SELECT R.readerid, R.readername, R.unit, R.bookcount, Count(B.reader)borrowedbooks FROM ReaderInfo R LEFT OUTER JOIN BookInfo B ON R.readerid=B.reader WHERE R.unit like unit AND R.bookcount >= minbookcount GROUP BY R.readerid, R.readerid, R.readername, R.unit, R.bookcount ORDER BY R.bookcount;-- 建立游标,该游标关联的查询语句有条件,该条件来自于该存储过程的输入类型参数 BEGIN OPEN cur_readebook; LOOP FETCH cur_readebook INTO v_readebook_rc; EXIT WHEN cur_readebook %NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_readebook_rc.v_readerid ||'-'|| v_readebook_rc.v_readername ||'-'|| v_readebook_rc v_unit ||'-'|| v_readebook_rc v_bookcount ||'-'|| v_readebook_rc v_count_reader); END LOOP; -- 利用循环遍历游标,把变量中的数据取出并输出到屏幕 CLOSE cur_readebook; end;
调用存储过程
EXEC PRO_READERLIST_SE('%', 3)
函数
为minbookcount设定默认值指针
CREATE PROCEDURE PRO_READERLIST_SE(unit IN VARCHAR2, minbookcount IN NUMBER DEFAULT 2) --后面的省略 同上脚本
CREATE PROCEDURE PRO_OUT_ELT(parm_out OUT VARCHAR2) AS BEGIN parm_out := '计算机系'; END; /
CREATE PROCEDURE PRO_READER_CLOSE AS v_readerinfo READERINFO2%ROWTYPE; v_elmts varchar2(30); CURSOR cursor_readerinfose IS SELECT * FROM READERINFO2 WHERE UNIT = v_elmts ORDER BY UNIT; -- 声明游标和关联条件,查询条件中使用了变量v_elmts BEGIN PRO_OUT_ELT(v_elmts); -- 调用存储过程PRO_OUT_ELT,为v_elmts赋值 OPEN cursor_readerinfose; LOOP FETCH cursor_readerinfose INTO v_readerinfo; EXIT WHEN cursor_readerinfose%NOTFOUND; IF V_readerinfo.bookcount < 3 THEN UPDATE READERINFO2 SET BOOKCOUNT = BOOKCOUNT+1 WHERE READERID = v_readerinfo.readerid; DBMS_OUTPUT.PUT_LINE('数据修改完毕...'); END IF; END LOOP; END; /
TIPScode
调用OUT类型参数得存储过程时,须要用变量填充,而不能用常量表达式填充。server
在调用存储过程当中,若是因发生未处理的异常而中断,那么调用者通常不会获得任何OUT参数的值,而在异常被处理的状况下推出,在发生一次航以前所获取的OUT参数值将被调用者得到。对象
在存储过程当中某个参数既能够是输入参数也能够是输出参数类型的参数,它既能够接收数据,也能够返回数据。
parameter IN OUT datatype
在Oracle的数据字典 USER_SOURCE 中记录用户定义的存储过程的元数据
SELECT DISTINCT NAME FROM USER_SOURCE WHERE TYPE = 'PROCEDURE'
-- 只查看当前用户全部的存储过程,不查看具体的脚本 SELECT * FORM USER_OBJECTS WHERE object_type = 'PROCEDURE';
SELECT NAME, LINE, TEXT, FROM USER_SOURCE-- line为脚本编号 text里面存放了存储过程的相关脚本 WHERE TYPE = 'PROCEDURE' AND NAME = 'PRO_READER'
错误提示语句的结构
SHOW ERRORS PROCEDURE procedure_name
-- 该脚本有错误 编译错误 '计算机系'后面少了分号 CREATE PROCEDURE PRO_READER2 AS BEGIN UPDATE READERINFO2 SET BOOKCOUNT = BOOKCOUNT+1 WHERE UNIT = '计算机系' END; /
CREATE [OR REPLACE] PROCEDURE [schema.] procedure_name [parameter_name] [[IN] datatype [{:=|DEFAULT} expression] | {OUT | IN OUT} [NOCOPY] datatype][,...]{IS | AS} BODY;
当存储过程的引用对象失效时调用者就会出现失效的状况,当这种状况出现时,只要不是脚本出现问题,只须要从新编译就能够正常使用了。
ALTER PROCEDURE procedure_name COMPILE;
DROP PROCEDURE [ schema. ] procedure_name
CREATE FUNCTION [ schema. ] function_name [ (paramter_declaration [, paramter_declaration]) ] RETURN datatype {IS | AS} [declare_selection] BEGIN statement [ statement | pagma ]... [EXCEPTION exception_handler [ exception_handler] ... ] END [name]; /
使用自定义函数注意
自定义函数尽可能不要操做数据库数据
若是在标准SQL调用自定义函数,那么被调用函数不容许有输出类型的参数。
若是在标准SQL中调用自定义函数,那么被调用函数将不能有事务操做语句和DDL语句等。
查询或增长、修改、删除操做所调用的函数降不容许操做任何数据表
CREATE FUNCTION MYUSER RETURN VARCHAR2 IS v_qnty VARCHAR2(20); --表示声明函数内部的变量,为VARCHAR2类型 BEGIN SELECT SYS.LOGIN_USER INTO v_qnty FROM DUAL; RETURN v_qnty; END; /
CREATE FUNCTION GETUNIT(in_readerid IN VARCHAR2) --建立函数GETUNIT,带有一个输入类型的参数 RETURN VARCHAR2 IS v_readerid VARCHAR2(20); BEGIN SELECT UNIT INTO v_readerid FROM READERINFO2 WHERE READERID = inreaderid; RETURN v_readerid; END; /
var v_unit VARCHAR2(10); EXEC :v_unit := GETUNIT('9702')
CREATE FUNCTION GETBOOKINFO(in_bookid IN NUMBER, out_pulish OUT VARCHAR2, out_author OUT VARCHAR2) RETURN VARCHAR2 IS v_bookname VARCHAR2(20); v_out_publish VARCHAR2(50); v_out_author VARCHAR2(50); BEGIN SELECT BOOKNAME. PUBLISH, AUTHOR INTO v_bookname, v_out_publish, v_author FROM BOOKID = in_bookid; out_publish := v_out_publish; out_author := v_out_author; RETURN v_bookname; END; /
CREATE FUNCTION GETBOOKINFO(in_bookid IN OUT NUMBER, out_pulish OUT VARCHAR2, out_author OUT VARCHAR2) RETURN VARCHAR2 IS v_bookname VARCHAR2(20); v_out_publish VARCHAR2(50); v_out_author VARCHAR2(50); v_out_price NUMBER(8); BEGIN SELECT BOOKNAME. PUBLISH, AUTHOR, PRICE INTO v_bookname, v_out_publish, v_author, v_out_price FROM BOOKID = in_bookid; out_publish := v_out_publish; out_author := v_out_author; in_bookid := v_out_price; RETURN v_bookname; END; /
-- 查看函数列表 SELECT OBJECT_NAEM, OBJECT_ID, STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE = 'FUNCTION';/
-- 查看函数相关脚本 SELECT * FROM USER_SOURCE WHERE TYPE = 'FUNCTION' AND NAME = 'MYUSER' ORDER BY LINE;/
CREATE OR REPLACE FUNCTION MYUSER RETURN VARCHAR2 IS v_qnty VARCHAR2(20); --表示声明函数内部的变量,为VARCHAR2类型 BEGIN SELECT SYS.LOGIN_USER INTO v_qnty FROM DUAL; RETURN v_qnty; END; /
ALTER FUNCTION function_name COMILE;
DROP FUNCTION function_name;
欢迎关注微信公众号哦~ ~