oracle動態存儲過程
A. oracle 存儲過程動態查詢
declare
v_tablename user_tables.table_name%type;
v_table user_tables%rowtype;
v_count number(10) := 0;
v_name varchar2(40);
v_sql varchar2(100) ;
cursor c is
select * from user_tables;
begin
open c ;
loop
fetch c
into v_table;
exit when c%notfound;
v_count := 0;
v_sql := ' select count(*) into v_count from ';
v_tablename := v_table.table_name;
v_sql := v_sql ||v_tablename ;
-- execute immediate v_sql;
dbms_output.put_line(v_count ||'----'|| v_tablename);
end loop;
close c;
end;
B. oracle動態存儲過程錯誤100不夠++急等
declare
userid number;
str varchar2(50);
begin
select t2.hot_ntid hot_ntid
,t2.hot_ntseq hot_ntseq
,t2.hot_nttitle hot_nttitle
,t2.hot_crtuser hot_crtuser
,t2.hot_startdate hot_startdate
,t1.hot_rdid hot_rdid
,t2.hot_urlevel hot_urlevel
from hot_notice2users t1
,hot_notices t2
where t1.hot_ntid =t2.hot_ntid
and t1.hot_status = 0
and t2.hot_orgid = 0
and t2.HOT_URLEVEL = str
and t1.hot_readerid = userid;
end ;
語法上是這樣的
但是你這樣沒有什麼意義吧,沒有輸出呀,也沒操作資料庫,只是把數據查出來還沒有顯示呢
下面這樣可以有輸出,結果會顯示在output頁
declare
userid number;
str varchar2(50);
cursor c_cur is
select t2.hot_ntid hot_ntid
,t2.hot_ntseq hot_ntseq
,t2.hot_nttitle hot_nttitle
,t2.hot_crtuser hot_crtuser
,t2.hot_startdate hot_startdate
,t1.hot_rdid hot_rdid
,t2.hot_urlevel hot_urlevel
from hot_notice2users t1
,hot_notices t2
where t1.hot_ntid =t2.hot_ntid
and t1.hot_status = 0
and t2.hot_orgid = 0
and t2.HOT_URLEVEL = str
and t1.hot_readerid = userid;
begin
FOR c1 IN c_cur
LOOP
dbms_output.put_line(c1.hot_ntid);
dbms_output.put_line(c1.hot_ntseq);
dbms_output.put_line(c1.hot_nttitle);
dbms_output.put_line(c1.hot_crtuser);
dbms_output.put_line(c1.hot_startdate);
dbms_output.put_line(c1.hot_rdid);
dbms_output.put_line(c1.hot_urlevel);
end loop;
end ;
C. 200分求助,occi動態調用oracle存儲過程問題
方法一:
對於你的這個介面,要求調用者除了傳入一個SQL語句之外,再傳入一個數組,這個數組裡面是一些枚舉值,代表參數化查詢語句裡面的參數的類型;
方法二:
存儲過程也是一個對象,不管什麼資料庫,應該都會有一張預先生成好了的表(比如叫SysInfo),用來保存後來用戶創建的對象(比如自定義函數,存儲過程等)的屬性,你查詢這張表,就可以知道存儲過程(存儲過程名字從SQL語句裡面動態獲取)的參數類型了。
D. oracle 在存儲過程中動態的建一個臨時表使用和在資料庫里寫死一個臨時表使用兩者有什麼區別
我們仍使用實驗 05中的環境,略去准備數據的過程。
我們仍然使用兩個會話,一個會話 run,用於運行主 SQL;另一個會話 ps,用於進行 performance_schema 的觀察:
主會話線程號為 29,
可以看到寫入的線程是 page_clean_thread,是一個刷臟操作,這樣就能理解數據為什麼是慢慢寫入的。
也可以看到每個 IO 操作的大小是 16K,也就是刷數據頁的操作。
結論:
我們可以看到,
1. MySQL 會基本遵守 max_heap_table_size 的設定,在內存不夠用時,直接將表轉到磁碟上存儲。
2. 由於引擎不同(內存中表引擎為 heap,磁碟中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實驗寫磁碟的數據量和實驗 05中使用內存的數據量不同。
3. 如果臨時表要使用磁碟,表引擎配置為 InnoDB,那麼即使臨時表在一個時間很短的 SQL 中使用,且使用後即釋放,釋放後也會刷臟頁到磁碟中,消耗部分 IO。
E. oracle存儲過程動態建表
需要用到動態sql。
1、首先要給用戶賦予許可權:
grantcreateanytableto用戶名;
2、創建存儲過程:
createprocerep_create_table
(v_sqlvarchar2)--輸入建表語句
as
begin
executeimmediatev_sql;
end;
3、執行:
F. Oracle 存儲過程的動態變數如何使用
實現思路:
第一步:先定義一個字元串,這個字元串SQL是由動態變數和其他的sql語句成分拼接組成。
第二步:直接執行 execute immediate SQL;
備註:以上方法是oracle提供的動態執行方法語句,直接使用就可以。
VAR_DYNAMIC_SQL := 'INSERT INTO RP_COMFIRMED_EVENT_DETAIL( EVENT_ID,--ID TRANS_TIME,--交易時間 TRANS_TYPE,--交易類型 TRANS_PROVINCE,--開戶省份 CCE_CSTNO,--客戶號 CCE_CERTTYPE,--證件類型 CCE_CERTNO,--證件號 CCE_AMT,--交易金額 CCE_RISK_SCORE,--不處理的風險分值 CCE_PAYEE_ACC,--付款人賬號 CCE_PAYEE_NAME,--付款人姓名 CCE_REC_NODE,--收款人開戶行 CCE_REC_ACC,--收款人賬號 CCE_REC_NAME,--收款人姓名 RULE_NAME,--規則名稱 CCE_RULE_NOTE,--規則描述 SCORE_RANGE--處理後的風險分值 )select EVENT_ID, SYS_CREATION_DATE, GET_NAME_BY_CODE(GET_TOTAL_EVENT_TYPE(T1.EVENT_TYPE,T1.USER_DEFINED_EVENT_TYPE),''eventType'') AS TRANS_TYPE, -- get_province(IP_COUNTRY,IP_CITY) AS CCE_TRANSTYPE, get_vale_from_cd_p('||get_vale_from_cd1('13','5')||'),--開戶省份為自定義欄位 USER_ID, '||get_vale_from_cd1('4','4')||',--證件類型為自定義欄位 '||get_vale_from_cd1('7','4')||',--證件號為自定義欄位 要轉換成動態SQL GET_AMT_BY_CURRENCY(AMOUNT_ORIGINAL,AMOUNT_CURRENCY),--通過匯率和幣種轉換 RISK_SCORE, USER_ACCT_NUMBER, '||get_vale_from_cd_g1(get_vale_from_cd_al)||',--付款人姓名 '||get_vale_from_cd1('11','5')||',--收款人開戶行 自定義欄位 需轉換成動態SQL EXT_ACCT_NUMBER, EXT_ACCT_OWNER_NAME, NVL(POLICY_RULE_ID,''FALLBACK_RULE'') AS RULE_NAME, SUBSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),INSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),''-'')+1),--描述 GET_SCORE_RANGE(RISK_SCORE) AS RISK_SCORE_RANGE FROM EVENT_LOG_REALTIME T1))'; execute immediate VAR_DYNAMIC_SQL;
G. 想用oracle的存儲過程動態建表
建立序列:
create sequence t_id
increment by 1
start with 1
nomaxvalue
cache 20;
建立自動建表過程:
create or replace procere pro_createtable(tname in varchar2 default to_char(sysdate,'yyyymm'))
as
v_sql varchar2(200);
v_tname varchar2(10);
begin
if length(tname)<>6 then
raise_application_error(-20000,'輸入參數長度不夠,不能轉換為日期格式!');
end if ;
if to_number(substr(tname,5,2)) not between 1 and 12 then
raise_application_error(-20001,'輸入參數中不包含有效的月份數字,不能轉換為日期格式!');
end if ;
--v_tname:=to_char(to_date(tname,'yyyymm'),'yyyymm');
v_tname:='hd_'||tname;
v_sql:='create table '||v_tname||' ('||
'id number not null,'||
'name varchar2(20),'||
'city varchar2(20))'||
'tablespace users';
execute immediate v_sql;
end;
測試:
begin
pro_createtable;
pro_createtable('201106');
pro_createtable('201115');--報錯
end;
H. oracle 的存儲過程中 動態的創建一張表 然後插入一個變數到這個表中,表能動態的創建但是變數不能插入進去
1、execute immediate ' insert into addtopinfo values('||sysdate||','||v_name||')'; v_name 既然是變數 怎麼可能會用' '括弧起來;
就算是 直接執行 的話 也是 execute immediate ' insert into addtopinfo values(sysdate,v_name);
2、如果有v_name的話 ,我建議你一般用拼sql的方式來執行
例如 如下格式(這個是我自己的procere截取的,可以參考下)
v_CreateSql := ' create table ' ||vv_owner||'.'|| vv_name_temp ||
' as select * from ' || iv_name || ' where 1=0';
execute immediate v_CreateSql;
3、下次報錯,請把你的出錯情況提出來。我們怎麼知道什麼錯呢?
I. oracle 存儲過程 動態sql語句
procere bulupdate語法上的錯誤
參數定義時的數據類型不能指定長度,varchar2(200)改為varchar2
sqlstring里那個加號去掉
open cursor 時,cursor名應該是定義的過程參數cur
J. Oracle創建包含動態sql的存儲過程
只能使用動態游標了。
給你個簡單例子:
declare
num#number;
recsys_refcursor;
begin
openrecfor'selectcount(*)fromempwhereempno=7788';
fetchrecintonum#;
closerec;
dbms_output.put_line(num#);
end;
/