時需要在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
2. 關於oracle存儲過程中的sql拼接,大神進!!!
procere proc_test(
in_id in varchar2,
out_sum out varchar2
) as
begin
execute immediate 'select count(*) from table_name '||in_id into out_sum;
end;
/
sqlplus里調用時:
var out_sum varchar2(10)
exec package_name.proc_test('where id=''XXX'' or 1=1',:out_sum)
print out_sum
3. 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
4. oracle存儲過程怎麼判斷一條sql語句是否成功
oracle存儲過程判斷一條sql語句是否成功的方法是增加exception處理,如果沒有拋出exception,那就證明正常執行了。
在Oracle中,異常分為以下兩類:
Oracle預定義異常
用戶自定義異常
在Oracle中預定義的異常如下表所示:
在Oracle中有以下三種方式觸發異常:
由Oracle自動觸發異常
使用RAISE語句手工觸發
調用存儲過程RAISE_APPLICATION_ERROR手工觸發
代碼將演示Oracle自動觸發異常:
-- Created on 2015-7-14 by JellyThink
declare
iA NUMBER(2) := 10;
begin
iA := iA / 0; -- Oracle自動觸發異常
dbms_output.put_line(iA);
exception
when ZERO_DIVIDE then
dbms_output.put_line('Error Code:' || SQLCODE || ' ' || SQLERRM);
when others then
dbms_output.put_line('Others Exception');
end;
5. oracle存儲過程中 sql寫法
表結構一樣的話record,
到時候就是
delete t where name= 『區一』;
delete t where name= 『區二』;
insert into t values(record1.貓數+record2.貓數。。。。。。。。。。。。。。。。。。。。。)即可
6. oracle 存儲過程中動態sql語句
v_sql :=' update aj set recount=(select num_rows from dba_tables where table_name = ' || v_tablename || ') where tablename=' || v_tablename
7. SQL命令查詢Oracle存儲過程信息
oracle資料庫中,已建立好的存儲過程信息存儲在系統表ALL_SOURCE 中,需要用sysdba身份登錄資料庫,進行查詢操作,SQL命令如下:
SELECTline,textFROMALL_SOURCE
WHERETYPE='PROCEDURE'
ANDNAME='過程名稱'
ANDOWNER='用戶名'
ORDERBYline;
存儲過程分成多行,每一行會存儲為一條數據,所以,查詢出來的會是多行,line表示行號。
ALL_SOURCE 表中還存儲了以下類型信息:
SQL>selectdistincttypefromall_source;
TYPE
------------
TYPE(對象)類型
TYPEBODY類型體
PROCEDURE存儲過程
FUNCTION函數
TRIGGER觸發器
PACKAGE包
PACKAGEBODY包體
8. 如何使用oracle存儲過程執行外部的sql腳本文件
你把腳本內容直接在存儲過程中實現,然後利用job去定時調度就好了。