當前位置:首頁 » 編程語言 » oracleselect動態sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oracleselect動態sql

發布時間: 2022-05-07 16:20:13

『壹』 Oracle存儲過程 動態sql報錯

execute immediate 'select count(1), count(distinct send_userid) ' ||
'from (select distinct query_key, send_userid ' ||
' from ' || t_name ||
' t where send_time >= trunc( ' || v_date ||
' ) + ( ' || i || ' - 1) / 48 ' ||
' and send_time < trunc(:1) + ' || i ||
' / 48) r '
into SEND_LETTERS1, SEND_UIDS1
using v_date;
into要放在外面,參數也要在外面

『貳』 oracle動態sql問題

這個屬於技巧。
如果後面的條件不成立,會變成 where 後面直接寫and了。。
為了保證有條件,所以要寫一句廢話保險。

『叄』 如何在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

『肆』 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(急)

通過」execute immediate sql「命令來實現。
第一步:創建可執行字元串「var sql:='select * form tablename' 」。
第二步:執行sql「execute immediate sql」。意思就是馬上執行sql語句。

『陸』 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

『柒』 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

『捌』 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的存儲過程

只能使用動態游標了。


給你個簡單例子:

declare
num#number;
recsys_refcursor;
begin
openrecfor'selectcount(*)fromempwhereempno=7788';
fetchrecintonum#;
closerec;
dbms_output.put_line(num#);
end;
/