① oracle函數 動態sql 給count變數賦值
雖然你沒問問題,但是我想你大概的意思是動態語句的值怎麼獲取吧。
動態語句里不能寫into,得放到外面來。這么寫:
executeimmediatep_sqlintop_max;
② 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如何執行
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(急)
通過」execute immediate sql「命令來實現。
第一步:創建可執行字元串「var sql:='select * form tablename' 」。
第二步:執行sql「execute immediate sql」。意思就是馬上執行sql語句。
⑤ oracle 存儲過程中動態sql語句
v_sql :=' update aj set recount=(select num_rows from dba_tables where table_name = ' || v_tablename || ') where tablename=' || v_tablename
⑥ Oracle 存儲過程的動態變數如何使用
實現思路:
第一步:先定義一個字元串,這個字元串SQL是由動態變數和其他的sql語句成分拼接組成。
第二步:直接執行 execute immediate SQL;
備註:以上方法是oracle提供的動態執行方法語句,直接使用就可以。
VAR_DYNAMIC_SQL := 'INSERT INTO RP_COMFIRMED_EVENT_DETAIL( EVENT_ID,--ID TRANS_TIME,--交易時間 TRANS_TYPE,--交易類型 TRANS_PROVINCE,--開戶省份 CCE_CSTNO,--客戶號 CCE_CERTTYPE,--證件類型 CCE_CERTNO,--證件號 CCE_AMT,--交易金額 CCE_RISK_SCORE,--不處理的風險分值 CCE_PAYEE_ACC,--付款人賬號 CCE_PAYEE_NAME,--付款人姓名 CCE_REC_NODE,--收款人開戶行 CCE_REC_ACC,--收款人賬號 CCE_REC_NAME,--收款人姓名 RULE_NAME,--規則名稱 CCE_RULE_NOTE,--規則描述 SCORE_RANGE--處理後的風險分值 )select EVENT_ID, SYS_CREATION_DATE, GET_NAME_BY_CODE(GET_TOTAL_EVENT_TYPE(T1.EVENT_TYPE,T1.USER_DEFINED_EVENT_TYPE),''eventType'') AS TRANS_TYPE, -- get_province(IP_COUNTRY,IP_CITY) AS CCE_TRANSTYPE, get_vale_from_cd_p('||get_vale_from_cd1('13','5')||'),--開戶省份為自定義欄位 USER_ID, '||get_vale_from_cd1('4','4')||',--證件類型為自定義欄位 '||get_vale_from_cd1('7','4')||',--證件號為自定義欄位 要轉換成動態SQL GET_AMT_BY_CURRENCY(AMOUNT_ORIGINAL,AMOUNT_CURRENCY),--通過匯率和幣種轉換 RISK_SCORE, USER_ACCT_NUMBER, '||get_vale_from_cd_g1(get_vale_from_cd_al)||',--付款人姓名 '||get_vale_from_cd1('11','5')||',--收款人開戶行 自定義欄位 需轉換成動態SQL EXT_ACCT_NUMBER, EXT_ACCT_OWNER_NAME, NVL(POLICY_RULE_ID,''FALLBACK_RULE'') AS RULE_NAME, SUBSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),INSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),''-'')+1),--描述 GET_SCORE_RANGE(RISK_SCORE) AS RISK_SCORE_RANGE FROM EVENT_LOG_REALTIME T1))'; execute immediate VAR_DYNAMIC_SQL;
⑦ 如何在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就是在sql語句中存在變數,根據變數的不同組合成各種條件的sql語句。比如一個循環裡面有一個查詢,這個循環的內容應用在這個查詢中,那麼這個查詢一定會有一個變數,而這個電郵變數的sql語句,就叫做動態sql。
⑨ oracle pl/sql中如何使用變數
定義並使用變數
PL/SQL有四種類型:標量類型,復合類型,引用類型 (reference),LOB(Large Obejct)類型
一、標量類型
最常用的就是標量類型,是指只能存放單個數值的變數,包括數字類型、字元類型、日期類型和布爾類型,每種類型又包含相應的子類型。
常量標量類型如下:
VARCHAR2 (n) , CHAR (n), NUMBER (p,s),DATE, TIMESTAMP , LONG , LONG RAW ,BOOLEAN,BINARY_INTEGER(僅 PL / SQL使用),BINARY_FLOAT和BINARY_DOUBLE(10g新引入的)
定義標量:
identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]
使用標量需要注意的是=號被:=取代,與delphi一樣的賦值符號@_@
例子:
v_name VARCHAR2 ( 10 );
v_rate CONSTANTS NUMBER ( 4 , 2 ) : = 3.04 ;
為了防止定義的變數類型與表中的欄位類型不一致,可以使用%TYPE來定義:
v_name employee.name % TYPE;
如上面所示,v_name的類型就與表 employee中的name欄位類型一樣!!
二、復合變數:
用於存放多個值的變數稱為復合變數,包括PL/SQL記錄,PL/SQL表,嵌套表和VARRAY四種類型
1.PL/SQL記錄
類似於C/C++中的結構概念:
declare
TYPE employee_record is RECORD(
id employee.id % TYPE,
name employee.name % TYPE,
email employee.email % TYPE);
em_record employee_record;
begin
select id,name,email into em_record from employee where name =& name;
dbms_output.put_line( ' 雇員名: ' || em_record.name || ' 雇員ID: ' || em_record.id);
end ;
2.PL/SQL表,類似於數組概念,不同的是PL/SQL表允許負值下標,而且沒有上下限,如:
declare
TYPE employee_table is table of employee.name % TYPE index by BINaRY_INTEGER;
em_table employee_table;
begin
select name into em_table( - 1 ) from employee where name =& name;
dbms_output.put_line( ' 雇員名: ' || em_table( - 1 ));
end ;
3.嵌套表,與PL/SQL 表相似,不同的是嵌套表可以做表列的數據類型,而PL/SQL表不能,使用嵌套表作為表列時,必須為其指定專門的存儲表,如:
create or replace TYPE emp_type as OBJECT(name VARCHAR2 ( 10 ),salary NUMBER ( 6 , 2 ),hiredate DATE);
CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;
CREATE TABLE department(
deptno NUMBER ( 2 ),dname VARCHAR2 ( 10 ),
employee emp_array)NESTED TABLE employee STORE as employee_dept;
4.VARRAY(變長數組),與嵌套表相似,也可以做為表列的數據類型,但是嵌套表沒有個數限制,而VARRAY有個數限制,如:
CREATE TYPE TEST_ARRAY IS VARRAY(20) OF emp_type;
三、引用變數(reference)
類似於C++中的指針或者JAVA中引用的概念,用於存放數值指針的變數,使用此變數,可以使得應用程序共享相同對象,降低佔用空間。此類有兩種類型:游標(REF CURSOR)和對象類型(REF OBJECT)
1.REF CURSOR,定義時同時指定SELECT語句的游標稱為顯式或者靜態游標,在打開時才指定SELECT語句的游標稱為動態游標,如:
DECLARE
TYPE c1 IS REF CURSOR ;
emp_cursor c1;
v_name employee.name % TYPE;
v_sal employee.salary % TYPE;
begin
open emp_cursor for
SELECT name,salary FROM EMPLOYEE ;
LOOP
FETCH emp_cursor INTO v_name,v_sal;
EXIT WHEN emp_cursor % NOTFOUND;
dbms_output.put_line(v_name);
END LOOP;
close emp_cursor;
end ;
2.REF OBJECT,與JAVA的引用概念相同,存儲的是指向對象的指針
四、LOB類型
LOB類型是指用於存儲大批量數據的變數,包括內部的3種(CLOB,BLOB,NCLOB)和外部LOB(BFILE)。
CLOB,NCLOB用於存儲大量的字元數據。
BLOB用於存儲大批量二進制數據(如圖象)。
BFILE則存儲指向OS文件的指針。
⑩ oracle的存儲過程里怎樣調用動態變數
實現思路:
第一步:先定義一個字元串,這個字元串SQL是由動態變數和其他的sql語句成分拼接組成。
第二步:直接執行execute immediate SQL;
備註:以上方法是oracle提供的動態執行方法語句,直接使用就可以。
VAR_DYNAMIC_SQL:='INSERTINTORP_COMFIRMED_EVENT_DETAIL(
EVENT_ID,--ID
TRANS_TIME,--交易時間
TRANS_TYPE,--交易類型
TRANS_PROVINCE,--開戶省份
CCE_CSTNO,--客戶號
CCE_CERTTYPE,--證件類型
CCE_CERTNO,--證件號
CCE_AMT,--交易金額
CCE_RISK_SCORE,--不處理的風險分值
CCE_PAYEE_ACC,--付款人賬號
CCE_PAYEE_NAME,--付款人姓名
CCE_REC_NODE,--收款人開戶行
CCE_REC_ACC,--收款人賬號
CCE_REC_NAME,--收款人姓名
RULE_NAME,--規則名稱
CCE_RULE_NOTE,--規則描述
SCORE_RANGE--處理後的風險分值
)select
EVENT_ID,
SYS_CREATION_DATE,
GET_NAME_BY_CODE(GET_TOTAL_EVENT_TYPE(T1.EVENT_TYPE,T1.USER_DEFINED_EVENT_TYPE),''eventType'')ASTRANS_TYPE,
--get_province(IP_COUNTRY,IP_CITY)ASCCE_TRANSTYPE,
get_vale_from_cd_p('||get_vale_from_cd1('13','5')||'),--開戶省份為自定義欄位
USER_ID,
'||get_vale_from_cd1('4','4')||',--證件類型為自定義欄位
'||get_vale_from_cd1('7','4')||',--證件號為自定義欄位要轉換成動態SQL
GET_AMT_BY_CURRENCY(AMOUNT_ORIGINAL,AMOUNT_CURRENCY),--通過匯率和幣種轉換
RISK_SCORE,
USER_ACCT_NUMBER,
'||get_vale_from_cd_g1(get_vale_from_cd_al)||',--付款人姓名
'||get_vale_from_cd1('11','5')||',--收款人開戶行自定義欄位需轉換成動態SQL
EXT_ACCT_NUMBER,
EXT_ACCT_OWNER_NAME,
NVL(POLICY_RULE_ID,''FALLBACK_RULE'')ASRULE_NAME,
SUBSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),INSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),''-'')+1),--描述
GET_SCORE_RANGE(RISK_SCORE)ASRISK_SCORE_RANGE
FROMEVENT_LOG_REALTIMET1
))';
executeimmediateVAR_DYNAMIC_SQL;