儲存過程(2)----Oracle
阿新 • • 發佈:2019-01-12
上一篇介紹的是mysql的儲存過程的一些語法
如:concat在Oracle裡是沒有的,Oracle拼接字元是用‘||’
Oracle用遊標是這樣的
CREATE OR REPLACE PROCEDURE UPDATE_SNS_USERSCORE(table_name in varchar2) as TYPE i_rowid IS TABLE OF ROWID; v_i_rowid i_rowid; type ref_cursor is ref cursor; c_rowid ref_cursor; v_errmsg varchar2(1024); BEGIN OPEN c_rowid FOR 'SELECT rowid FROM '||table_name ; LOOP fetch c_rowid bulk collect into v_i_rowid LIMIT 1000; FORALL i IN 1 .. v_i_rowid.COUNT EXECUTE IMMEDIATE 'UPDATE '|| table_name||' SET SNS_SCORE=0,READ_SCORE=0,FIRST_RANK=1,SECOND_RANK=1,THIRD_RANK=1,LOGIN_FLAG=0,UPDATE_TIME=SYSDATE WHERE rowid = :1' USING v_i_rowid(i); COMMIT; exit when c_rowid%NOTFOUND; END LOOP; COMMIT; close c_rowid; exception when others then rollback; v_errmsg := 'sqlexception~~sqlcode:' || to_char(sqlcode) || ' sqlstate:' || substr(sqlerrm, 1, 512); prc_iread_sys_writelog(2, 4, 'UPDATE_SNS_USERSCORE', v_errmsg, ''); commit; end UPDATE_SNS_USERSCORE;
type wmshuaiqi:定義型別變數
execute immediate的簡單用法(oracle)
create or replace procedure proc_test( --引數區域 ) is --變數區域 --sql指令碼 v_sql varchar2(2000) :=''; --記錄學生數量 v_num number; begin --執行區域 -- execute immediate用法1:立刻執行sql語句 v_sql := 'create or replace view myview as select id,name from student'; execute immediate v_sql; --- execute immediate用法2:立刻執行sql語句,並賦值給某個變數 v_sql := 'select count(1) from student'; execute immediate v_sql into v_num; -- execute immediate用法3:帶引數的sql v_sql:='select * from student t where t.name=:1 and t.age=:2'; execute immediate v_sql using 'ZhangSan',23; end proc_test;