動態SQL運用實例

語法
8.1.6之前:

EXECUTE IMMEDIATE dynamic_sql_string
[INTO {define_var1 [, define_var2] ... | plsql_record}]
[USING [IN | OUT | IN OUT] bind_arg1 [,
[IN | OUT | IN OUT] bind_arg2] ...];

8.1.6 開始包括 "returning into"

EXECUTE IMMEDIATE dynamic_sql_string
[INTO {define_var1 [, define_var2] ... | plsql_record}]
[USING [IN | OUT | IN OUT] bind_arg1 [,
[IN | OUT | IN OUT] bind_arg2] ...]
[{RETURNING | RETURN} INTO bind_arg3 [, bind_arg4] ...];

1.執行 DDL:
declare
str varchar2(200);
begin
str := 'create table dy_sql (dno number,dtext varchar2(120))';
EXECUTE IMMEDIATE str;
end;
/
2.執行非查詢DML:
declare
str varchar2(200);
begin
str := 'insert into dy_sql values (1,''Hello'')';
EXECUTE IMMEDIATE str;
end;
/

3.執行非查詢DML,並使用變數 :
declare
str varchar2(200);
val varchar2(20);
begin
str := 'insert into dy_sql values (2,:b1)';
val := 'SQL';
EXECUTE IMMEDIATE str USING val;
commit;
end;
/

4.執行查詢單一變數,單一筆回傳
set serverout on
declare
str varchar2(200);
val varchar2(20);
ret varchar2(20);
begin
str := 'select dtext from dy_sql where dtext = :b1';
val := 'SQL';
EXECUTE IMMEDIATE str INTO ret USING val;
dbms_output.put_line('Value fetched from table: '||ret);
end;
/

5.使用PL/SQL record type
declare
str varchar2(200);
val varchar2(20);
ret dy_sql%rowtype;
begin
str := 'select dno,dtext from dy_sql where dno = :b1';
val := 2;
EXECUTE IMMEDIATE str INTO ret USING val;
dbms_output.put_line('Value fetched number:'||ret.dno||' ; name:'||ret.dtext);
end;
/

6.Returning、OUT變數運用
declare
str varchar2(200);
val varchar2(20);
ret varchar2(20);
begin
val := 1;
str := 'delete from dy_sql where dno = :b1 returning dtext into :b2';
EXECUTE IMMEDIATE str USING val, OUT ret;
dbms_output.put_line('Deleted '||sql%rowcount||' row(s) with value: '||ret);
end;
/

7.動態創建function,並使用它,再將function 移除
declare
str varchar2(200);
val number;
ret number;
begin
begin
str := 'create or replace function doubleit (p1 in number)'||
' return number as begin return p1*2; end;';
EXECUTE IMMEDIATE str;
end;
-- Call the stored function
str := 'begin :b1 := doubleit(:b2); end;';
val := 30;
EXECUTE IMMEDIATE str USING OUT ret, IN val;
dbms_output.put_line('Result of '||val||' doubled is '||ret);
EXECUTE IMMEDIATE 'drop function doubleit';
end;

/

8.利用動態SQL暫時使用index
declare
str varchar2(200);
val varchar2(120);
ret number;
ret2 dy_sql.dtext%type;
begin
str := 'create index i_dy_sql_1 on dy_sql(dtext)';
EXECUTE IMMEDIATE str;
str := 'select dno,dtext from dy_sql where dtext = :b1';
val := 'SQL';
EXECUTE IMMEDIATE str into ret,ret2 using val ;
dbms_output.put_line('Result of dtext='||val||':dno is '||ret||',dtext is '||ret2);
str := 'drop index i_dy_sql_1 ';
EXECUTE IMMEDIATE str;
end;
/

9.宣告 REF CURSOR
declare
type my_curs_type is REF CURSOR;
curs my_curs_type;
str varchar2(200);
ret varchar2(20);
begin
str := 'select dtext from dy_sql';
OPEN curs FOR str;
loop
FETCH curs INTO ret;
exit when curs%notfound;
dbms_output.put_line(ret);
end loop;
CLOSE curs;
end;
/

10.使用變數
declare
type my_curs_type is REF CURSOR;
curs my_curs_type;
str varchar2(200);
ret dy_sql%rowtype;
val varchar2(20);
begin
str := 'select dno,dtext from dy_sql where dno <> :b1';
val := 0;
OPEN curs FOR str USING val;
loop FETCH curs INTO ret;
exit when curs%notfound;
dbms_output.put_line('Value fetched dno:'||ret.dno||',dtext:'||ret.dtext);
end loop;
CLOSE curs;
end;

/

11.使用bulk collect得到多筆資料

declare
type MY_CUR is ref cursor;
CURS MY_CUR;
row_dy_sql dy_sql%rowtype;
type STR_TAB is TABle of dy_sql%rowtype;
REC_TAB STR_TAB;
str varchar2(120);
begin
STR:= ' select dno,dtext from dy_sql';
open CURS for STR;
fetch curs bulk collect into rec_tab limit 100;
close CURS;
for I in 1..REC_TAB.count
LOOP
DBMS_OUTPUT.PUT_LINE('rec_tab:' ||REC_TAB(I).DNO ||','||REC_TAB(I).DTEXT);
end LOOP;
end;

/

動態SQL運用實例的更多相关文章

  1. 篇章三:[AngularJS] 使用AngularCSS動態載入CSS

    前言 使用AngularAMD動態載入Controller 使用AngularAMD動態載入Service 上列兩篇文章裡,介紹了如何如何使用AngularAMD來動態載入Controller與Ser ...

  2. 篇章二:[AngularJS] 使用AngularAMD動態載入Service

    前言 「使用AngularAMD動態載入Controller」:這篇文章裡介紹如何使用AngularAMD來動態載入Controller.本篇文章以此為基礎,介紹如何使用AngularAMD來動態載入 ...

  3. SQL Server 2016 的「動態資料遮罩 (Dynamic Data Masking)」

    一些特別注重資訊安全.個人資料的公司或產業 (如: 金融.保險業),通常「測試用資料庫」的資料,會加上「遮蔽:去識別化」的功能,避免個資外洩.以往必須自己撰寫 SQL 語句或 Stored Proce ...

  4. 簡單SQL存儲過程實例

    簡單SQL存儲過程實例 摘自:http://blog.csdn.net/libra6956/article/details/5589173 实例1:只返回单一记录集的存储过程. 银行存款表(bankM ...

  5. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)

    說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...

  6. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)

    說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...

  7. [C#]動態叫用Web Service

    http://www.dotblogs.com.tw/jimmyyu/archive/2009/04/22/8139.aspx 摘要 Web Service對大家來說想必都不陌生,也大都了解Web S ...

  8. 篇章一:[AngularJS] 使用AngularAMD動態載入Controller

    前言 使用AngularJS來開發Single Page Application(SPA)的時候,可以選用AngularUI Router來提供頁面內容切換的功能.但是在UI Router的使用情景裡 ...

  9. 小林的VB6動態壁紙模擬程序

    本項目參考了以下資料[這可能對你理解程序運行有幫助]: https://github.com/Yinmany/WinWallpaper https://blog.csdn.net/breaksoftw ...

随机推荐

  1. HTTP和HTTPS的区别?

    HTTP1.1(Hypertext Transfer Protocol Vertion 1.1)超文本传输协议-版本1.1它是用来在Internet上传送超文本的传送协议.它是运行在Tcp/Ip协议族 ...

  2. 在 Visual Studio 中调试 XAML 设计时异常

    在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...

  3. tornado基本使用【服务】

    1.安装 2.请求处理程序和请求参数 1.安装 pip install tornado 2.请求处理程序和请求参数 Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornad ...

  4. HashMap和Hashtable的比较

    相同点 HashMap和Hashtable都是存储“键值对(key-value)”的散列表,而且都是采用拉链法解决hash冲突的.但是1.8中,hashmap引入了红黑树.Hashtable没有引入红 ...

  5. VMware 安装提示缺少MicrosoftRuntime DLL 问题解决办法

    VMware 安装提示缺少MicrosoftRuntime DLL 问题解决办法 刚刚安装VMware失败了试了好多办法,在这总结一下. 下面是程序的截图 这是报错信息 网上的解决方法: 当出现安装失 ...

  6. Datatable paging,Repeater with Paging

    /// <summary> /// 塗聚文 /// 20140225 /// </summary> public partial class DatatablePage : S ...

  7. 针对 IE的 的优化

    针对 IE 的优化 有些时候,你需要对 IE 浏览器的 bug 定义一些特别的规则,这里有太多的 CSS 技巧(hacks),我只使用其中的两种方法,不 管微软在即将发布的 IE7 beta 版里是否 ...

  8. Android 马甲包制作流程

    一.马甲包的制作流程 1.配置马甲包的applicationId以及应用名称 在app的build.gradle文件中添加马甲包的配置 android { signingConfigs { confi ...

  9. App Inventor 网络资源及推荐书目

    Ai2服务器 官方服务器:http://ai2.appinventor.edu/ 官方备用服务器:(大陆可用):http://contest.appinventor.mit.edu/ 国内个人服务器: ...

  10. 任务六:通过HTML及CSS模拟报纸排版

    任务目的 深入掌握CSS中的字体.背景.颜色等属性的设置 进一步练习CSS布局 任务描述 参考 PDS设计稿(点击下载),实现页面开发,要求实现效果与 样例(点击查看) 基本一致 页面中的各字体大小, ...