動態sql語句oracle
『壹』 oracle筆記-動態sql
孫告第 章 動態SQL
為何使用動態SQL
實現動態SQL有兩種方式 DBMS_SQL和本地動態SQL(EXECUTE IMMEIDATE)
主要從以下方面考慮使用哪種方式
是否知道涉及的列數和類型
DBMS_SQL包括了一個可以 描述 結果集的存儲過程(DBMS_SQL DESCRIBE_COLUMNS) 而本地動態SQL沒有
是否知道可能涉及的綁定變數數和類型
DBMS_SQL允許過程化的綁定語句的輸入 而本地動態SQL需要在編譯時確定
是否使用 數組化 操作(Array Processing)
DBMS_SQL允許 而本地動態SQL基本不可以 但可以用其他方式實現(對查詢可用FETCH BULK COLLECT INTO 對INSERT等 可用一個BEGIN … END塊中加循環實現)
是否在同一個會話中多次執行同一語句
DBMS_SQL可以分析一次執行多次 而本地動態SQL會在每次執行時進行軟分析
是否需要用REF CURSOR返回結果集
僅本地動態SQL可用REF CURSOR返回結果集
如何使用動態SQL
DBMS_SQL
調用OPEN_CURSOR獲得一個游標句柄
調用PARSE分析語句 一個游標句柄可以用於多條不同的已分析語句 但一個時間點僅一條有效
調用BIND_VARIABLE或BIND_ARRAY來提供語句的任何輸入
若是一個查詢(SELECT語句) 調用DIFINE_COLUMN或DEFINE_ARRAY來告知賣凱掘Oracle如何返回結果
調用EXECUTE執行語句
若是一個查中核詢 調用FETCH_ROWS來讀取數據 可以使用COLUMN_VALUE從SELECT列表根據位置獲得這些值
否則 若是一個PL/SQL塊或帶有RETURN子句的DML語句 可以調用VARIABLE_VALUE從塊中根據變數名獲得OUT值
調用CLOSE_CURSOR
注意這里對任何異常都應該處理 以關閉游標 防止泄露資源
本地動態SQL
EXECUTE IMMEDIATE 語句
[INTO {變數 變數 … 變數N | 記錄體}]
[USING [IN | OUT | IN OUT] 綁定變數 … 綁定變數N]
[{RETURNING | RETURN} INTO 輸出 [ … 輸出N]…]
注意本地動態SQL僅支持弱類型REF CURSOR 即對於REF CURSOR 不支持BULK COLLECT
最後說明
lishixin/Article/program/Oracle/201311/18948
『貳』 ORACLE裡面動態的添加欄位,如果存在就不添加,如果不存在就添加。sql語句怎麼寫
declare
p_table_namevarchar2(30);
p_column_namevarchar2(30);
p_data_typevarchar2(30);
p_cntnumber;
p_sqlvarchar2(4000);
begin
p_table_name:='';
p_column_name:='';
selectcount(1)intop_cntfromuser_tab_colswherea.table_name=p_table_nameanda.column_name=p_column_name;
ifp_cnt=0then
p_sql:='altertable'||p_table_name||'add'||p_column_name||''||p_data_type;
executeimmediatep_sql;
endif;
end;
沒測試,不過基本應該可以
『叄』 oracle資料庫動態SQL語句問題
是這樣子的:
正常的SQL應該是這樣:
SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME='EMP';
然後游態V_SQL:='';最外層也是有引號的
當表名是變數,但是我們查的時候是需要加上單引號的,銷磨逗如果最外面的單引號的話,則裡面的單引號就需要單引號再加單引號這樣來引用的。
所以,如虧賣果你測試你的V_SQL寫的正常不正常的話,可以用raise_application_error(-20201,V_SQL);查看,因為這樣輸出的是正常的sql的哦。
『肆』 oracle 中動態sql語句,表名為變數,怎麼解
表名可用變數,但一般需要用到動態sql,舉例如下:
declare
v_date varchar2(8);--定義日期變數
v_sql varchar2(2000);--定義動態sql
v_tablename varchar2(20);--定義動態表名
begin
select to_char(sysdate,'yyyymmdd') into v_date from al;--取日期變數
v_tablename := 'T_'||v_date;--為動態表命名
v_sql := 'create table '||v_tablename||'
(id int,
name varchar2(20))';--為動態sql賦值
dbms_output.put_line(v_sql);--列印sql語句
execute immediate v_sql;--執行動態sql
end;
執行以後,就會生成以日期命名的表。
『伍』 oracle動態表名查詢 如何寫sql語句或者存儲過程實現: 根據某張表中的某個欄位的值決定查詢哪一張表
begin
for cur in(select id,flag fromu a)
loop
if cur.flag=0 then
select * from b;
...
else
select * from C;
...
end if;
end loop;
end;
『陸』 如何在oracle存儲過程中執行動態sql語句
給你一個案例對這些,使用execute immediate就可以了,存儲過程和語句塊也是一樣的,自己改一改,沒區別的。
語法格式
EXECUTEIMMEDIATEdynamic_string
[INTO{define_variable[,define_variable]...|record}]
[USING[IN|OUT|INOUT]bind_argument[,[IN|OUT|INOUT]bind_argument]...]
[{RETURNING|RETURN}INTObind_argument[,bind_argument]...];
1,操作DDL語句,這也是動態SQL的常用操作之一
如下所示使用動態SQL創建資料庫表:
DECLARE
l_dync_sqlVARCHAR2(100);
BEGIN
l_dync_sql:='CREATETABLEcux_dync_test(idNUMBER,creation_dateDATE)';
EXECUTEIMMEDIATEl_dync_sql;
END;
2,操作DML語句,使用USING子句可以按照順序將輸入的值綁定到變數,如果動態SQL只有單行輸出的話可以直接使用INTO來接收輸出值,如下所示。
DECLARE
l_dync_sqlVARCHAR2(100);
l_person_nameVARCHAR2(140);
l_ageNUMBER;
BEGIN
l_dync_sql:='SELECTperson_name,ageFROMcux_cursor_testWHEREperson_id=:1';
EXECUTEIMMEDIATEl_dync_sql
INTOl_person_name,l_age--使用into語句接手動態SQL的輸出,如果輸出多行則出錯
USING101;--給綁定變數賦值
dbms_output.put_line('PersonName:'||l_person_name);
dbms_output.put_line('Age:'||l_age);
END;
『柒』 oracle存儲過程中如何執行動態SQL語句
有時需要在oracle
存儲過程
中執行動態SQL
語句
,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法:
set
serveroutput
on
declare
n
number;
sql_stmt
varchar2(50);
t
varchar2(20);
begin
execute
immediate
'alter
session
set
nls_date_format=''YYYYMMDD''';
t
:=
't_'
||
sysdate;
sql_stmt
:=
'select
count(*)
from
'
||
t;
execute
immediate
sql_stmt
into
n;
dbms_output.put_line('The
number
of
rows
of
'
||
t
||
'
is
'
||
n);
end;
如果動態SQL
語句
很長很復雜,則可用包裝.
CREATE
OR
REPLACE
PACKAGE
test_pkg
IS
TYPE
cur_typ
IS
REF
CURSOR;
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ);
END;
/
CREATE
OR
REPLACE
PACKAGE
BODY
test_pkg
IS
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ)
IS
sqlstr
VARCHAR2(2000);
BEGIN
sqlstr
:=
'SELECT
*
FROM
'||v_table;
OPEN
t_cur
FOR
sqlstr;
END;
END;
/
在oracle
中批量導入,導出和刪除表名以某些字元開頭的表
spool
c:\a.sql
select
'drop
table
'
||
tname
||
';'
from
tab
where
tname
like
'T%';
spool
off
@c:\a