❶ 下面關於sql語言的說法中,哪一種說法是錯誤的
沒有備選答案。
簡單地說,SQL是一種集合化的查詢語言,即操作數和返回結果都是集合(也就是二維表)。
SQL語言的語句分成三大類:
數據定義語言,包括create、alter、drop等;
數據操縱語言,包括insert、update、delete、select等;
數據控制語言,包括grant、revoke、commit、rollback等。
❷ 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
❸ 大俠,能介紹點關於動態SQL的資料嗎
以下內容基本來自http://www.hxu.e.cn/partwebs/jisuanjixi/ctsn/sjkyl/3/3.7.5.htm
如果SQL語句中主變數的個數與數據類型在預編譯時都是確定的,只有主變數的值是程序運行過程中動態輸入的,我們稱這類嵌入式SQL語句為靜態SQL語句。
靜態SQL語句提供的編程靈活性在許多情況下仍顯得不足,有時候我們需要編寫更為通用的程序。例如,查詢學生選課關系SC,任課教師想查選修某門課程的所有學生的學號及其成績,班主任想查某個學生選修的所有課程的課程號及相應成績,學生想查某個學生選修某門課程的成績,也就是說查詢條件是不確定的,要查詢的屬性列也是不確定的,這時就無法用一條靜態SQL語句實現了。
實際上,如果在預編譯時下列信息不能確定,我們就必須使用動態SQL技術:
·SQL語句正文
·主變數個數
·主變數的數據類型
·SQL語句中引用的資料庫對象(例如列、索引、基本表、視圖等)
動態SQL方法允許在程序運行過程中臨時「組裝」SQL語句,主要有三種形式:
(1) 語句可變。可接收完整的SQL語句。即允許用戶在程序運行時臨時輸入完整的SQL語句。
(2) 條件可變。
對於非查詢語句,條件子句有一定的可變性。例如刪除學生選課記錄,既可以是因某門課臨時取消,需要刪除有關該課程的所有選課記錄,也可以是因為某個學生退學,需要刪除該學生的所有選課記錄。
對於查詢語句,SELECT子句是確定的,即語句的輸出是確定的,其他子句(如WHERE子句、HAVING短語)有一定的可變性。例如查詢學生人數,可以是查某個系的學生總數,查某個性別的學生人數,查某個年齡段的學生人數,查某個系某個年齡段的學生人數等等,這時SELECT子句的目標列表達式是確定的(COUNT(*)),但WHERE子句的條件是不確定的。
(3) 資料庫對象、查詢條件均可變。對於查詢語句,SELECT子句中的列名、FROM子句中的表名或視圖名、WHERE子句和HAVING短語中的條件等等均可由用戶臨時構造,即語句的輸入和輸出可能都是不確定的。例如我們前面查詢學生選課關系SC的例子。對於非查詢語句,涉及的資料庫對象及條件也是可變的。
這幾種動態形式幾乎可覆蓋所有的可變要求。
以下是我自己的一些感受:
動態sql無非就是兩步:根據需要構造sql語句,然後執行。不同資料庫的執行方法各不相同。在ms sql中主要是通過exec或SP_EXECUTESQL來執行動態sql語句。
動態sql說起來很簡單,但應用場景很廣,在不同場景下使用技巧也各有不同,這只有靠樓主在使用的過程中去慢慢體會和積累了。
❹ 如何動態執行sql語句
這里只介紹動態SQL的使用。關於動態SQL語句的語法,參見:http://blog.csdn.NET/chiclewu/article/details/16097133
1.什麼是時候需要使用動態SQL?
SQL文本在編譯時是未知的。
例如,SELECT語句包含的標識符(如表名)在編譯時是未知的,或者WHERE子句的條件數量在編譯時是未知。
靜態SQL不支持
例如,在PL/SQL中用靜態SQL只能執行查詢以及DML語句。如果想要執行DDL語句,只能使用動態SQL。
當讓使用靜態SQL,也有它的好處:
編譯成功驗證了靜態SQL語句引用有效的資料庫對象和訪問這些對象的許可權
編譯成功創建了模式對象的依賴關系
2.EXECUTE 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 emp.ename%type := 'SCOTT';
begin
v_sql_text := 'select e.sal from emp e where e.ename = :ename';
execute immediate v_sql_text
into v_sal
using v_ename;
dbms_output.put_line(v_ename || ':' || v_sal);
end;
使用動態SQL返回一條記錄,查詢SCOTT的基本信息:
declare
v_sql_text varchar2(1000);
v_ename emp.ename%type := 'SCOTT';
vrt_emp emp%rowtype;
begin
v_sql_text := 'select * from emp e where e.ename = :ename';
execute immediate v_sql_text
into vrt_emp
using v_ename;
dbms_output.put_line(v_ename || '的基本信息:');
dbms_output.put_line('工號:' || vrt_emp.empno);
dbms_output.put_line('工資:' || vrt_emp.sal);
dbms_output.put_line('入職日期:' || vrt_emp.hiredate);
end;
2.2動態SQL語句是一個可以返回多行的SELECT語句
2.2.1隻有一個佔位符
使用動態SQL語句返回多行記錄,查詢30部門的員工基本信息:
declare
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 30;
type nt_emp is table of emp%rowtype;
vnt_emp nt_emp;
begin
v_sql_text := 'select * from emp e where e.deptno = :deptno';
execute immediate v_sql_text bulk collect
into vnt_emp
using v_deptno;
for i in 1 .. vnt_emp.count loop
dbms_output.put_line(vnt_emp(i).ename || '的基本信息:');
dbms_output.put_line('工號:' || vnt_emp(i).empno);
dbms_output.put_line('工資:' || vnt_emp(i).sal);
dbms_output.put_line('入職日期:' || vnt_emp(i).hiredate);
dbms_output.put_line('');
end loop;
end
2.2.2多個佔位符
查詢20部門工資大於2000的員工基本信息:
declare
v_sql_text varchar2(1000);
v_deptno emp.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 e.sal>:sal and e.deptno = :deptno';
execute immediate v_sql_text bulk collect
into vnt_emp
using v_sal, v_deptno; --注意綁定多個變數時,綁定變數只與佔位符位置有關,與佔位符名稱無關,
for i in 1 .. vnt_emp.count loop
dbms_output.put_line(vnt_emp(i).ename || '的基本信息:');
dbms_output.put_line('工號:' || vnt_emp(i).empno);
dbms_output.put_line('工資:' || vnt_emp(i).sal);
dbms_output.put_line('入職日期:' || vnt_emp(i).hiredate);
dbms_output.put_line('');
end loop;
注意:對於SQL文本,佔位符名稱是沒有意義的,綁定變數與佔位符名稱無關,只與佔位符的配置有關。即使有多個相同名稱佔位符,也需要每個佔位符對應一個綁定變數。對於PL/SQL塊,佔位符名稱是有意義的,相同名稱的佔位符,只需要第一個佔位符綁定變數。
2.3動態SQL語句是一個帶有RETURNING子句的DML語句
KING的工資增長20%,返回增長後的工資:
eclare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'KING';
begin
v_sql_text := 'update emp e set e.sal= e.sal*1.2 where e.ename = :ename returning e.sal into :sal';
execute immediate v_sql_text
using v_ename
returning into v_sal;
dbms_output.put_line(v_ename || ':' || v_sal);
end;
注意:只有當v_sql_text語句有returning into子句時,動態SQL語句才能使用returning into子句。
2.4給佔位符傳遞NULL值
2.4.1通過未初始化變數傳遞NULL值
declare
v_sql_text varchar2(1000);
v_deptno emp.ename%type := 'ALLEN';
v_comm emp.comm%type;
begin
v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';
execute immediate v_sql_text
using v_comm, v_deptno;
end;
2.4.2通過函數將NULL值顯式的轉換成一個有類型的值
declare
v_sql_text varchar2(1000);
v_deptno emp.ename%type := 'ALLEN';
begin
v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';
execute immediate v_sql_text
using to_number(null), v_deptno;
end;
3.OPEN FOR語句
PL/SQL引入OPEN FOR語句實際上並不是為了支持本地動態SQL,而是為了支持游標變數。現在它以一種極其優雅的方式實現了多行的動態查詢。
使用OPEN FOR語句來關聯動態SQL語句的游標變數,在OPEN FOR語句的USING子句中,指定動態SQL語句每個佔位符的綁定參數。
使用FETCH語句獲取運行時結果集。
使用CLOSE語句關閉游標變數
使用OPEN FOR語句查詢出10部門的員工的基本信息:
declare
type rc_emp is ref cursor;
vrc_emp rc_emp;
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 10;
vrt_emp emp%rowtype;
begin
v_sql_text := 'select * from emp e where e.deptno=:deptno';
open vrc_emp for v_sql_text
using v_deptno;
loop
exit when vrc_emp%notfound;
fetch vrc_emp
into vrt_emp;
dbms_output.put_line(vrt_emp.ename || '的基本信息:');
dbms_output.put_line('工號:' || vrt_emp.empno);
dbms_output.put_line('工資:' || vrt_emp.sal);
dbms_output.put_line('入職日期:' || vrt_emp.hiredate);
dbms_output.put_line('');
end loop;
close vrc_emp;
end;
4.重復的佔位符名稱
如果在動態SQL語句重復佔位符名稱,要知道佔位符關聯綁定參數的方式依賴於動態語句的類型。
如果執行的是一個動態SQL字元串,則必須為每一個佔位符提供一個綁定參數,即使這些佔位符是重復的。
如果執行的是一個動態PL/SQL塊,則必須為每一個唯一佔位符提供一個綁定參數,即重復的佔位符只需要提供一個綁定參數。
4.1重復佔位符的動態SQL字元串
declare
v_sql_text varchar2(1000);
v_sal emp.sal%type := 4000;
v_comm emp.comm%type;
v_ename emp.ename%type := 'SCOTT';
begin
v_sql_text := 'update emp e set e.sal=:sal , e.comm = :sal*0.1 where e.ename =:ename returning e.comm into :comm ';
execute immediate v_sql_text
using v_sal, v_sal, in v_ename
returning into v_comm;
dbms_output.put_line(v_ename || '分紅:' || v_comm);
end;
4.2重復佔位符的動態PL/SQL塊
declare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'KING';
begin
v_sql_text := ' begin select e.sal,e.ename into :sal,:ename from emp e where e.ename =:ename; end;';
execute immediate v_sql_text
using out v_sal, in out v_ename;
dbms_output.put_line(v_ename || ':' || v_sal);
end;
❺ mybatis中動態sql語句有哪些
最佳答案
MyBatis的動態SQL是基於OGNL表達式的,它可以幫助我們方便的在SQL語句中實現某些邏輯。
MyBatis中用於實現動態SQL的元素主要有:
if
choose(when,otherwise)
trim
where
set
foreach
❻ 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;
執行以後,就會生成以日期命名的表。
❼ 存儲過程中使用動態sql語句
SET @sql =@sql+N' and schoolName in (select schoolName from Schools where SchoolName ='''+@schoolName+''')'
❽ 動態SQL語句報錯
告訴你這種sql調試的方法
第一步
刪除begin與end間的內容,用你熟悉的肯定沒錯的語句替代,
第二步
聲明只保留一行 然後編譯,如果出錯,肯定是在第一行
如果沒錯則
循環按此方法每次保留下一個有效行即可調通整個sql