當前位置:首頁 » 存儲配置 » oracle動態sql執行存儲過程

oracle動態sql執行存儲過程

發布時間: 2022-06-20 16:32:27

1. oracle 存儲過程執行動態sql 返回結果給游標,外部程序獲得dataset結果集。

你這樣寫就可以了,ORACLE存儲過程不需要返回值,只要參數是out就代表為輸出參數了,你給它傳一個游標進去,執行完,這個游標的值就是你查詢的值了。

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

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

3. 如何動態執行存儲過程或函數

您好,很高興為您解答。

/*動態執行存儲過程DEMO*/
DECLARE
v_Procere_Name VARCHAR2(320); --存儲過程名
v_Input_Parameter1 VARCHAR2(320); --傳入參數1
v_Input_Parameter2 VARCHAR2(320); --傳入參數2
v_Return_Int INTEGER; --接收返回值
v_Return_String VARCHAR2(320); --接收返回值

v_Sql_Str VARCHAR2(320); --動態執行SQL語句
BEGIN
/*獲取存儲過程名,可以從資料庫中動態讀取需要執行的存儲過程,本DEMO直接賦值*/
v_Procere_Name := 'Wms_Application_Out_p.Application_Out_List_Refuse(:i_Str1,:i_Str2,_Return_Int,_Return_String)';
/*本DEMO假定需要調用的存儲過程有兩個傳入參數和兩個傳出參數*/
v_Input_Parameter1 := 'test01'; --傳入參數1,在實際應用中根據具體情況機型賦值
v_Input_Parameter2 := 'test01'; --傳入參數2,在實際應用中根據具體情況機型賦值
/*動態生成需要執行存儲過程的SQL語句*/
v_Sql_Str := 'BEGIN ' || v_Procere_Name || '; END;';
/*執行該SQL語句*/
EXECUTE IMMEDIATE v_Sql_Str
USING IN v_Input_Parameter1, IN v_Input_Parameter2, OUT v_Return_Int, OUT v_Return_String; --參數類型和傳遞順序必須與存儲過程中的保持一致
/*輸出返回值*/
Dbms_Output.Put_Line(v_Return_Int || v_Return_String);
END;

/*動態執行函數DEMO*/
DECLARE
v_Function_Name VARCHAR2(320); --函數名
v_Input_Parameter1 VARCHAR2(320); --傳入參數1
v_Return_String VARCHAR2(320); --接收返回值

v_Sql_Str VARCHAR2(320); --動態執行SQL語句
BEGIN
/*獲取函數名,可以從資料庫中動態讀取需要執行的函數,本DEMO直接賦值*/
v_Function_Name := 'Return_Str_f(:i_Str1)';
/*本DEMO假定需要調用的函數有1個傳入參數*/
v_Input_Parameter1 := 'test01'; --傳入參數1,在實際應用中根據具體情況機型賦值
/*動態生成需要執行函數的SQL語句*/
v_Sql_Str := 'begin :v_Return_String := ' || v_Function_Name || '; end;';
/*執行該SQL語句*/
EXECUTE IMMEDIATE v_Sql_Str
USING OUT v_Return_String, IN v_Input_Parameter1; --接收返回值必須在前,傳入參數類型和傳遞順序必須與函數中保持一致
/*輸出返回值*/
Dbms_Output.Put_Line(v_Return_String);
END;

/*所調用函數*/
CREATE OR REPLACE FUNCTION Return_Str_f(i_Str1 VARCHAR2) RETURN VARCHAR2 IS
v_Sql_Str VARCHAR2(320);
v_Str1 VARCHAR2(320);
BEGIN
/*生成動態執行SQL*/
v_Sql_Str := 'SELECT ''' || i_Str1 || ''' FROM DUAL';
EXECUTE IMMEDIATE v_Sql_Str
INTO v_Str1; --接收返回值
/*輸出返回結果*/
Dbms_Output.Put_Line('v_str1=' || v_Str1);
RETURN v_Str1;
END;

相關資料:
Oracle PL/SQL中動態執行SQL EXECUTE IMMEDIATE

在plsql中經常遇到sql語句是在過程中動態生成的,這個時候可以用EXECUTE IMMEDIATE來執行生成的sql語句。轉一個javaeye(貌似他也是轉的,找不到出處)上的EXECUTE IMMEDIATE用法。
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析並馬上執行動態的SQL語句或非運行時創建的PL/SQL塊.動態創建和執行SQL語句性能超前,EXECUTE IMMEDIATE的目標在於減小企業費用並獲得較高的性能,較之以前它相當輕易編碼.盡管DBMS_SQL仍然可用,

但是推薦使用EXECUTE IMMEDIATE,因為它獲的收益在包之上。
使用技巧
1. EXECUTE IMMEDIATE將不會提交一個DML事務執行,應該顯式提交
假如通過EXECUTE IMMEDIATE處理DML命令,那麼在完成以前需要顯式提交或者作為EXECUTE IMMEDIATE自己的一部分. 假如通過EXECUTE IMMEDIATE處理DDL命令,它提交所有以前改變的數據
2. 不支持返回多行的查詢,這種交互將用臨時表來存儲記錄(參照例子如下)或者用REF cursors.
3. 當執行SQL語句時,不要用分號,當執行PL/SQL塊時,在其尾部用分號.
4. 在Oracle手冊中,未具體覆蓋這些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能給你帶來方便.
5. 對於Forms開發者,當在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.
EXECUTE IMMEDIATE用法例子
1. 在PL/SQL運行DDL語句
begin
execute immediate 'set role all';
end;
2. 給動態語句傳值(USING 子句)
declare
l_depnam varchar2(20) := 'testing';
l_locvarchar2(10) := 'Du';
begin
execute immediate 'insert into dept values(:1, :2, :3)'
using 50, l_depnam, l_loc;
commit;
end;
3. 從動態語句檢索值(INTO子句)
declare
l_cntvarchar2(20);
begin
execute immediate 'select count(1) from emp'
into l_cnt;
dbms_output.put_line(l_cnt);
end;
4. 動態調用常式.常式中用到的綁定變數參數必須指定參數類型.黓認為IN類型,其它類型必須顯式指定
declare
l_routin varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam varchar2(20) := 'emp';
l_cntnumber;
l_status varchar2(200);
begin
execute immediate 'begin ' l_routin '(:2, :3, :4); end;'
using in l_tblnam, out l_cnt, in out l_status;
if l_status != 'OK' then
dbms_output.put_line('error');
end if;
end;
5. 將返回值傳遞到PL/SQL記錄類型;同樣也可用%rowtype變數
declare
type empdtlrec is record (empnonumber(4),
enamevarchar2(20),
deptnonumber(2));
empdtl empdtlrec;
begin
execute immediate 'select empno, ename, deptno '
'from emp where empno = 7934'
into empdtl;
end;
6. 傳遞並檢索值.INTO子句用在USING子句前
declare
l_deptpls_integer := 20;
l_nam varchar2(20);
l_loc varchar2(20);
begin
execute immediate 'select dname, loc from dept where deptno = :1'
into l_nam, l_loc
using l_dept ;
end;
7. 多行查詢選項.對此選項用insert語句填充臨時表,用臨時表進行進一步的處理,也可以用REF cursors糾正此缺憾.
declare
l_sal pls_integer := 2000;
begin
execute immediate 'insert into temp(empno, ename) '
'select empno, ename from emp '
'wheresal :1'
using l_sal;
commit;
end;
對於處理動態語句,EXECUTE IMMEDIATE比以前可能用到的更輕易並且更高效.當意圖執行動態語句時,適當地處理異常更加重要.應該關注於捕捉所有可能的異常.

如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】

希望我的回答對您有所幫助,望採納!

~ O(∩_∩)O~

4. Oracle 存儲過程內部如何執行一個sql語句

用 execute immediate mSql;來執行,也就是Oracle的動態 sql 語句

5. 怎樣SQL存儲過程中執行動態SQL語句

1.EXEC的使用
EXEC命令有兩種用法,一種是執行一個
存儲過程
,另一種是執行一個動態的
批處理
。以下所講的都是第二種用法。
下面先使用EXEC演示一個例子,代碼1
DECLARE
@TableName
VARCHAR(50),@Sql
NVARCHAR
(MAX),@OrderID
INT;
SET
@TableName
=
'Orders';
SET
@OrderID
=
10251;
SET
@sql
=
'SELECT
*
FROM
'+QUOTENAME(@TableName)
+'WHERE
OrderID
=
'+
CAST(@OrderID
AS
VARCHAR(10))+'
ORDER
BY
ORDERID
DESC'
EXEC(@sql);
sp_executesql命令在SQL
Server中引入的比EXEC命令晚一些,它主要為重用執行計劃提供更好的支持。
為了和EXEC作一個鮮明的對比,我們看看如果用代碼1的代碼,把EXEC換成sp_executesql,看看是否得到我們所期望的結果
DECLARE
@TableName
VARCHAR(50),@sql
NVARCHAR(MAX),@OrderID
INT
,@sql2
NVARCHAR(MAX);
SET
@TableName
=
'Orders
';
SET
@OrderID
=
10251;
SET
@sql
=
'SELECT
*
FROM
'+QUOTENAME(@TableName)
+
'
WHERE
OrderID
=
'+CAST(@OrderID
AS
VARCHAR(50))
+
'
ORDER
BY
ORDERID
DESC'
EXEC
sp_executesql
@sql

6. oracle動態sql語句執行問題

直接調用就可以了。舉個例子把 B 存儲過程調用A 存儲過程。
PROCEDURE A (p_1 in number,p_2 out number)

is
v_1 number;
begin
V_1:=p_1;
p_2:=v_1;
end A;

(1)如果A 與B同在一個package裡面的話。那麼 B裡面直接可以調用A
PS:如果A,B在同一個Package 中無法調用的話,那麼很可能是A,B在Spec里沒有聲明。一個package包含Spec 和Body,兩層。不能調用很可能沒有聲明。聲明後應該ok!

PROCEDURE B(p_1 in number)
is
v_result number;

begin

v_result =A(p_1);

end B;
其中v_result就是調用A的結果,A的返回值。

(2)如果A與B不在同一個package的話
那麼B在調用A 的時候,需要加上pkg的名字
比如:A 存儲過程在pkg :xxom_test_pkg 中

PROCEDURE B(p_1 in number)
is
v_result number;
begin
v_result = xxom_test_pkg .A(p_1);

end B;

----------------------------------------------------------
以上簡單介紹了存儲過程的調用。
希望對你有幫助

7. 如何在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;
procere
test_proc
(v_table
varchar2,t_cur
out
cur_typ);
end;
/
create
or
replace
package
body
test_pkg
is
procere
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

8. oracle 存儲過程中動態sql語句

v_sql :=' update aj set recount=(select num_rows from dba_tables where table_name = ' || v_tablename || ') where tablename=' || v_tablename

9. oracle存儲過程中如何執行動態SQL語句 詳細

有時需要在oracle 存儲過程中執行動態SQL 語句 ,例如表名是動態的,或欄位是動態的, 或查詢命令是動態的,可用下面的方法: set serveroutput ondeclaren number;sql_stmt varchar2(50); t varchar2(20);beginexecute 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_pkgISTYPE cur_typ IS REF CURSOR; PROCEDURE test_proc (v_table VARCHAR2,t_cur OUT cur_typ);END;/ CREATE OR REPLACE PACKAGE BODY test_pkgISPROCEDURE test_proc (v_table VARCHAR2,t_cur OUT cur_typ)ISsqlstr VARCHAR2(2000);BEGINsqlstr := 'SELECT * FROM '||v_table; OPEN t_cur FOR sqlstr;END;END;/ 在oracle 中批量導入,導出和刪除表名以某些字元開頭的表 spool c:\a.sql

10. 動態sql中如何執行 帶參數的存儲過程

exec
sp_executesql
@sqlGetCount,N'@Counts
int
out
',@Counts
out
實際上
就是通過這個sp_executesql來執行存儲過程時,會定義變數
@Counts
,然後執行你的語句把值放到@Counts
里,最後返回。
另外,本質上這個和exec語句是一樣的都是動態執行sql。

熱點內容
java輸出到文件 發布:2025-03-19 01:49:07 瀏覽:429
光遇國際服安卓和蘋果如何互通 發布:2025-03-19 01:43:03 瀏覽:316
如何加密應用 發布:2025-03-19 01:42:04 瀏覽:618
lol伺服器人數怎麼擠 發布:2025-03-19 01:29:19 瀏覽:838
兄弟連的php 發布:2025-03-19 01:24:25 瀏覽:810
自己做腳本可不可以 發布:2025-03-19 01:20:13 瀏覽:533
33的源碼值 發布:2025-03-19 01:13:25 瀏覽:814
虛榮安卓怎麼充值 發布:2025-03-19 01:12:27 瀏覽:892
如何更改報考密碼 發布:2025-03-19 01:08:12 瀏覽:416
python日期類型 發布:2025-03-19 01:02:28 瀏覽:415