當前位置:首頁 » 編程語言 » oracle函數動態sql

oracle函數動態sql

發布時間: 2023-06-15 00:05:47

Ⅰ 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(急)

好吧,我辛苦下,我來給你寫拼接SQL函數

create table t_a (
c1 varchar2(200),
c2 varchar2(200),
ca varchar2(200),
cb varchar2(200),
cc varchar2(200)
);

create or replace function get_sql_of_tab( c_owner varchar, c_tab_name varchar) return varchar2 as
c_sql varchar2(4000) ;
cursor c1 is
select t.column_name from dba_tab_cols t
where table_name = upper(c_tab_name)
and owner = upper(c_owner)
order by t.column_id;
begin
for r1 in c1 loop
c_sql := c_sql ||' ' || r1.column_name ||',' ;
end loop ;
c_sql := 'SELECT '|| substr(c_sql,1,length(c_sql)-1) || ' FROM '||upper(c_tab_name) ;
return c_sql ;
end get_sql_of_tab ;
/

---------------------以下是PL/SQL命令窗口函數的效果-------------

SQL> select get_sql_of_tab('gxbx','t_a') from al ;

GET_SQL_OF_TAB('GXBX','T_A')
--------------------------------------------------------------------------------
SELECT C1, C2, CA, CB, CC FROM T_A

嘿嘿,動態生產SQL,好吧剩下的你應該明白咋做了。

函數的兩個入參 用戶名 表名,NND忘記說了

Ⅲ oracle函數 動態sql 給count變數賦值

雖然你沒問問題,但是我想你大概的意思是動態語句的值怎麼獲取吧。

動態語句里不能寫into,得放到外面來。這么寫:

executeimmediatep_sqlintop_max;

Ⅳ oracle 中動態sql什麼時候用

動態sql一般用在存儲過程中,可以在存儲過程中使用DDL或DML語句,如創建刪除操作。
語法:execute immediate 'DDL或DML語句'

Ⅳ 如何在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語句問題

是這樣子的:
正常的SQL應該是這樣:
SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME='EMP';
然後游態V_SQL:='';最外層也是有引號的
當表名是變數,但是我們查的時候是需要加上單引號的,銷磨逗如果最外面的單引號的話,則裡面的單引號就需要單引號再加單引號這樣來引用的。
所以,如虧賣果你測試你的V_SQL寫的正常不正常的話,可以用raise_application_error(-20201,V_SQL);查看,因為這樣輸出的是正常的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

Ⅷ Oracle [存儲過程] 執行動態拼接SQL語句並返回結果

建議你用 instr函數,v_sql條件改為
where instr(p_jbm,t.jbm)>0試試吧。

熱點內容
pow在c語言中什麼 發布:2025-02-12 21:07:24 瀏覽:320
php查詢mysql連接 發布:2025-02-12 21:05:45 瀏覽:632
linuxc當前時間 發布:2025-02-12 21:03:32 瀏覽:28
雲鎖神伺服器 發布:2025-02-12 21:03:29 瀏覽:487
c語言int和float 發布:2025-02-12 21:03:24 瀏覽:20
我的世界有什麼好玩的大伺服器 發布:2025-02-12 21:01:59 瀏覽:98
方舟手游如何解鎖自己的伺服器 發布:2025-02-12 20:54:09 瀏覽:657
貓影視源碼 發布:2025-02-12 20:42:05 瀏覽:923
區域網如何訪問其他電腦 發布:2025-02-12 20:39:06 瀏覽:378
新平板電腦的數字密碼如何知道 發布:2025-02-12 20:31:19 瀏覽:345