靜態SQL語句中的“動態”功能是什么呢
一般地講,在 SELECT 語句的 SELECT 部分實現選擇功能,可以用DECODE函數。
如: SELECT DECODE(字段1,'A',字段A, 'B',字段B, 'C',字段C, 字段D) FROM 表名; 這樣就可以根據每條記錄的字段1的值來選擇其它字段的值。 當然這里要注意:字段A,B,C,D的類型要一致或可自動轉換。
還可以在WHERE部分實現選擇功能。 如: SELECT …… FROM 表名 WHERE (其它必需的條件) AND (C_V !='0' OR 可選條件1) AND (C_V !='1' OR 可選條件2) AND (C_V !='3' OR 可選條件3) …… ; 說明: 1。
上面語句的含義為:當控制變量C_V為0時,按 可選條件1 來選擇;當控制變量C_V為1時,按 可選條件2 來選擇…… 2。要注意,控制變量的名字不要與表中的原有字段名相同。
3。上面的這段程序可以寫在 PROCEDURE 或 FUNCTION 中,控制變量可以作為過程或函數的輸入參數。
4。省略號表示類似上面三行的語句可以寫多次。
5。上面所述的 WHERE 部分中條件的選擇,可以用在任何語句的WHERE部分中。
動態SQL是什么??什么是靜態SQL,動態SQL的動態體現在哪里??
首先,所謂SQL的動態和靜態,是指SQL語句在何時被編譯和執行,二者都是用在SQL嵌入式編程中的,這里所說的嵌入式是指將SQL語句嵌入在高級語言中,而不是針對于單片機的那種嵌入式編程。
在某種高級語言中,如果嵌入了SQL語句,而這個SQL語句的主體結構已經明確,例如在Java的一段代碼中有一個待執行的SQL“select * from t1 where c1>5”,在Java編譯階段,就可以將這段SQL交給數據庫管理系統去分析,數據庫軟件可以對這段SQL進行語法解析,生成數據庫方面的可執行代碼,這樣的SQL稱為靜態SQL,即在編譯階段就可以確定數據庫要做什么事情。
而如果嵌入的SQL沒有明確給出,如在Java中定義了一個字符串類型的變量sql:String sql;,然后采用preparedStatement對象的execute方法去執行這個sql,該sql的值可能等于從文本框中讀取的一個SQL或者從鍵盤輸入的SQL,但具體是什么,在編譯時無法確定,只有等到程序運行起來,在執行的過程中才能確定,這種SQL叫做動態SQL。例如每一種數據庫軟件都有能夠執行SQL語句的界面,那個界面接收的SQL就是動態SQL,因為數據庫廠商在做這個界面時,并不知道用戶會輸入哪些SQL,只有在該界面執行后,接收了用戶的實際輸入,才知道SQL是什么。
另外還要注意一點,在SQL中如果某些參數沒有確定,如"select * from t1 where c1>? and c2<;?",這種語句是靜態SQL,不是動態SQL,雖然個別參數的值不知道,但整個SQL的結構已經確定,數據庫是可以將它編譯的,在執行階段只需將個別參數的值補充進來即可。
如何動態執行sql語句
這里只介紹動態SQL的使用。
關于動態SQL語句的語法,參見:http://**chiclewu/article/details/160971331.什么是時候需要使用動態SQL?SQL文本在編譯時是未知的。例如,SELECT語句包含的標識符(如表名)在編譯時是未知的,或者WHERE子句的條件數量在編譯時是未知。
靜態SQL不支持例如,在PL/SQL中用靜態SQL只能執行查詢以及DML語句。如果想要執行DDL語句,只能使用動態SQL。
當讓使用靜態SQL,也有它的好處:編譯成功驗證了靜態SQL語句引用有效的數據庫對象和訪問這些對象的權限編譯成功創建了模式對象的依賴關系*E IMMEDIATE語句EXECUTE IMMEDIATE語句的意思是使用本地動態SQL處理大多數動態SQL語句。如果動態SQL語句是自包含的(也就是說,它的綁定參數沒有占位符,并且結果不可能返回錯誤),則EXECUTE IMMEDIATE語句不需要子句。
如果動態SQL語句包行占位符綁定參數,每個占位符在EXECUTE IMMEDIATE語句的子句中必須有一個相應的綁定參數,具體如下:如果動態SQL語句是一個最多只能返回一行的SELECT語句,OUT綁定參數放置在INTO子句,IN綁定參數放置在USING子句。如果動態SQL語句是一個可以返回多行的SELECT語句,OUT綁定參數放置在BULK COLLECT INTO子句,IN綁定參數放置在USING子句。
如果動態SQL語句是一個除了SELECT以外的其他DML語句,且沒有RETURNING INTO子句,所有的綁定參數放置在USING子句中。如果動態SQL還語句一個匿名PL/SQL塊或CALL語句,把所有的綁定參數放置在USING子句中。
如果動態SQL語句調用一個子程序,請確保:每個對應子程序參數占位符的綁定參數與子程序參數具有相同的參數模式和兼容的數據類型。綁定參數不要有SQL不支持的數據類型(例如,布爾類型,關聯數組,以及用戶自定的記錄類型)USING子句不能包含NULL字面量。
如果想要在USING子句中使用NULL值,可以使用位初始化的變量或者函數顯示將NULL轉換成一個有類型的值。2.1動態SQL語句是一個最多只能返回一行的SELECT語句使用動態SQL語句返回單列,查詢SCOTT的薪水:declare v_sql_text varchar2(1000); v_sal number; v_ename *%type := 'SCOTT'; begin v_sql_text := 'select * from emp e where * = :ename'; execute immediate v_sql_text into v_sal using v_ename; dbms_*_line(v_ename || ':' || v_sal);end;使用動態SQL返回一條記錄,查詢SCOTT的基本信息:declare v_sql_text varchar2(1000); v_ename *%type := 'SCOTT'; vrt_emp emp%rowtype; begin v_sql_text := 'select * from emp e where * = :ename'; execute immediate v_sql_text into vrt_emp using v_ename; dbms_*_line(v_ename || '的基本信息:'); dbms_*_line('工號:' || vrt_*); dbms_*_line('工資:' || vrt_*); dbms_*_line('入職日期:' || vrt_*te);end;2.2動態SQL語句是一個可以返回多行的SELECT語句2.2.1只有一個占位符使用動態SQL語句返回多行記錄,查詢30部門的員工基本信息:declare v_sql_text varchar2(1000); v_deptno *%type := 30; type nt_emp is table of emp%rowtype; vnt_emp nt_emp; begin v_sql_text := 'select * from emp e where * = :deptno'; execute immediate v_sql_text bulk collect into vnt_emp using v_deptno; for i in 1 .. vnt_* loop dbms_*_line(vnt_emp(i).ename || '的基本信息:'); dbms_*_line('工號:' || vnt_emp(i).empno); dbms_*_line('工資:' || vnt_emp(i).sal); dbms_*_line('入職日期:' || vnt_emp(i).hiredate); dbms_*_line(''); end loop;end2.2.2多個占位符查詢20部門工資大于2000的員工基本信息:declare v_sql_text varchar2(1000); v_deptno *%type := 20; v_sal number := 2000; type nt_emp is table of emp%rowtype; vnt_emp nt_emp; begin v_sql_text := 'select * from emp e where *>:sal and * = :deptno'; execute immediate v_sql_text bulk collect into vnt_emp using v_sal, v_deptno; --注意綁定多個變量時,綁定變量只與占位符位置有關,與占位符名稱無關, for i in 1 .. vnt_* loop dbms_*_line(vnt_emp(i).ename || '的基本信息:'); dbms_*_line('工號:' || vnt_emp(i).empno); dbms_*_line('工資:' || vnt_emp(i).sal); dbms_*_line('入職日期:' || vnt_emp(i).hiredate); dbms_*_line(''); end loop;注意:對于SQL文本,占位符名稱是沒有意義的,綁定變量與占位符名稱無關,只與占位符的配置有關。
即使有多個相同名稱占位符,也需要每個占位符對應一個綁定變量。對于PL/SQL塊,占位符名稱是有意義的,相同名稱的占位符,只需要第一個占位符綁定變量。
2.3動態SQL語句是一個帶有RETURNING子句的DML語句KING的工資增長20%,返回增長后的工資:eclare v_sql_text varchar2(1000); v_sal 。
動態SQL四種類型的語句格式是什
1。
Dynamic SQL Format 1 EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ; eg: string Mysql Mysql = "CREATE TABLE Employee "& +"(emp_id integer not null,"& +"dept_id integer not null, "& +"emp_fname char (10) not null, "& +"emp_lname char(20) not null)" EXECUTE IMMEDIATE :Mysql ; 2。 Dynamic SQL Format 2 PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ; EXECUTE DynamicStagingArea USING {ParameterList} ; eg: INT Emp_id_var = 56 PREPARE SQLSA FROM "DELETE FROM employee WHERE emp_id=?" ; EXECUTE SQLSA USING :Emp_id_var ; 3。
Dynamic SQL Format 3 DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ; PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ; OPEN DYNAMIC Cursor {USING ParameterList} ; EXECUTE DYNAMIC Procedure {USING ParameterList} ; FETCH Cursor | Procedure INTO HostVariableList ; CLOSE Cursor | Procedure ; eg: integer Emp_id_var DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ; PREPARE SQLSA FROM "SELECT emp_id FROM employee" ; OPEN DYNAMIC my_cursor ; FETCH my_cursor INTO :Emp_id_var ; CLOSE my_cursor ;。