execute immediate

来源:https://www.cnblogs.com/outmanxiaozhou/archive/2018/12/29/10196613.html
-Advertisement-
Play Games

首先在這裡發發牢騷,指責下那些刻板的書寫方式,不考慮讀者理不理解,感覺就是給專業人員用來複慣用的一樣,沒有前戲,直接就高潮,實在受不了!沒基礎或基礎差的完全不知道發生了什麼,一臉懵逼的看著,一星差評!!! execute immediate 以下引用介紹比較好的例子說明 看了上面的代碼,是否覺得理解 ...


首先在這裡發發牢騷,指責下那些刻板的書寫方式,不考慮讀者理不理解,感覺就是給專業人員用來複慣用的一樣,沒有前戲,直接就高潮,實在受不了!沒基礎或基礎差的完全不知道發生了什麼,一臉懵逼的看著,一星差評!!!

execute immediate

以下引用介紹比較好的例子說明

create or replace procedure proc_test(
--參數區域
)
is 
--變數區域
    --sql腳本
    v_sql varchar2(2000) :='';
    --記錄學生數量
    v_num number;
begin
--執行區域

    -- execute immediate用法1:立刻執行sql語句
    v_sql := 'create or replace view myview as select id,name from student';
    execute immediate v_sql;
    
    --- execute immediate用法2:立刻執行sql語句,並賦值給某個變數
    v_sql := 'select count(1) from student';
    execute immediate v_sql into v_num;
    
    -- execute immediate用法3:帶參數的sql
    v_sql:='select * from student t where t.name=:1 and t.age=:2'; 
    execute immediate v_sql using 'ZhangSan',23;
    
end proc_test;
/

看了上面的代碼,是否覺得理解?NO,NO,NO

對execute immediate  的解釋如下

簡單來說 就是你一個存儲過程當中 創建了一個表 table_a 然後要用insert into將其他的數據插入到這個table_a當中,但是因為你在創建過程的時候 table_a還不存在,過程就會顯示有編譯錯誤,因為table_a不存在必然導致過程無法執行,所以無法編譯成功,而把insert into語句加如到 execute immediate之後 則oracle不會再去理會這個對象是否存在,因此可以成功編譯和執行。

看完了,估計還會有小朋友舉手問,跟動態有什麼關係,為何扯上動態,哪裡動態了,能不能講明白,等等。。。

敲黑板,人家說的動態,是說execute immediate後面跟的SQL代碼不固定,你想寫就寫啥,動態的!

然後又有小朋友,站起來了,你呀的,胡我啊,說最後代碼,隨便寫,我都想笑,這個跟直接寫SQL代碼,不要前面的execute immediate有什麼區別?不都執行那條語句麽?

哈哈,小朋友你坐下別激動,你問到點上了,execute immediate後邊SQL代碼要用一對單引號的(即' '),而直接寫SQL沒有的對吧,告訴你動態的秘訣就在於execute immediate後邊SQL代碼可以去拼接,這就實現了所謂動態,會根據不同情況,拼接不同的代碼。

簡單舉例

直接寫的   select * from dual;

用execute immediate寫    v_sql:='select * from dual';                                           EXECUTE IMMEDIATE v_sql;  一般來說直接寫SQL的性能是高於拼字元串的,因為如果執行拼字元串的需要內部自動調動oracle機制,先解析字元串映射成SQL語句然後再執行。 但是拼SQL的方式有好處。即SQL語句是一個字元串可以動態拼接,根據不同的條件來改變SQL語句,這是直接寫SQL所不能達到的。 拼SQL還有個好處就是    v_sql:='select * from tables t where t.c_date=:1 and t.name=:2';                                            EXECUTE IMMEDIATE v_sql USING '20130304','xiaoming'; 可以動態的對參數傳遞值,這是最大的優勢。  語法結構:
EXECUTE IMMEDIATE dynamic_string
[INTO {define_variable[,define_variable]| record}]
[USING [IN | OUT | IN OUT] bind_argument[,[IN | OUT \ IN OUT] bind_argumnet]…]
[{RETURNING | RETURN} INTO bind_argument[,bind_argument]…];

本地動態SQL語句一個優點是可以在代碼中是使用綁定變數。

先說說綁定變數 ":"稱綁定變數指示符,解釋如下:

它是用戶放入查詢中的占位符,它會告訴Oracle" 現在生成一個方案框架,實際執行語句的時候,會提供應該使用的實際值"。

例子如下:
select * from emp where dep='sale' ;                   //不使用綁定變數
select * from emp where dep=:sale                    //使用綁定變數

用法
    處理DDL操作(CREATE,ALTER,DROP)
    CREATE OR REPLACE PROCEDURE drop_table(table_name VARCHAR2)
    IS
     Sql_statemet VARCHAR2(100);
    BEGIN 
     Sql_statement:=’DROP TABLE’ || table_name;
     EXECUTE IMMEDIATE sql_statement;
    END;
    /
    建立過程drop_table後,調用如下:
    SQL> exec drop_table(‘worker’)
    處理DCL操作(GRANT REVOKE)
    SQL> conn system/manager
    CREATE OR REPLACE PROCEDURE grant_sys_priv(priv VARCHAR2,username VARCHAR2)
    IS
     Sql_stat VARCHAR2(100);
    BEGIN
     Sql_stat:=’GRANT “ || priv|| ’ TO ’|| username;
    EXECUTE IMMEDIATE sql_stat;
    END;
    /
    調用
    SQL> exec grant_sys_priv(‘CREATE SESSION’,’SCOTT’)
    處理DML操作(INSERT UPDATE DELETE)
    如果DML語句帶有占位符,那麼在E I語句中則要帶USING子句
    如果DML語句帶有RETURNING子句,那麼E I語句中要帶有RETURNINGINTO子句
    例子,處理單行查詢:
    DECLARE
     sql_stat VARCHAR2(100);
     emp_record tbl%ROWTYPE;
    BEGIN
     sql-stat:='SELECT * FROM tbl WHERE tblno=:no';
     EXECUTE IMMEDIATE sql_stat INTO emp_record USING &1;
     dbms_output.put_line(emp_record.ename||emp_record.sal);
    END;

EXECUTE IMMEDIATE -- 用法例子


1. 在PL/SQL運行DDL語句


begin
   execute immediate 'set role all';
end;


2. 給動態語句傳值(USING 子句)


declare
   l_depnam varchar2(20) := 'testing';
   l_loc     varchar2(10) := 'Dubai';
   begin
   execute immediate 'insert into dept values   (:1, :2, :3)'
     using 50, l_depnam, l_loc;
   commit;
end;


3. 從動態語句檢索值(INTO子句)


declare
   l_cnt     varchar2(20);
begin
   execute immediate 'select count(1) from emp'
     into l_cnt;
   dbms_output.put_line(l_cnt);
end;


4. 動態調用常式.常式中用到的綁定變數參數必須指定參數類型.
黓認為IN類型,其它類型必須顯式指定


declare
   l_routin    varchar2(100) := 'gen2161.get_rowcnt';
   l_tblnam    varchar2(20) := 'emp';
   l_cnt       number;
   l_status    varchar2(200);
begin
   execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
     using in l_tblnam, out l_cnt, in out l_status;

   if l_status != 'OK' then
      dbms_output.put_line('error');
   end if;
end;


5. 將返回值傳遞到PL/SQL記錄類型;同樣也可用%rowtype變數


declare
   type empdtlrec is record (empno   number(4),
                            ename   varchar2(20),
                            deptno   number(2));
   empdtl empdtlrec;
begin
   execute immediate 'select empno, ename, deptno ' ||
                    'from emp where empno = 7934'
     into empdtl;
end;


6. 傳遞並檢索值.INTO子句用在USING子句前


declare
   l_dept     pls_integer := 20;
   l_nam      varchar2(20);
   l_loc      varchar2(20);
begin
   execute immediate 'select dname, loc from dept where deptno = :1'
     into l_nam, l_loc
     using l_dept ;
end;


7. 多行查詢選項.對此選項用insert語句填充臨時表,
用臨時表進行進一步的處理,也可以用REF cursors糾正此缺憾.

declare
   l_sal    pls_integer := 2000;
begin
   execute immediate 'insert into temp(empno, ename) ' ||
                    '           select empno, ename from emp ' ||
                    '           where   sal > :1'
     using l_sal;
   commit;
end;

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著對ubuntu的瞭解,突然想在自己的筆記本上裝一個雙系統。在網上查了安裝方法之後,發現因為nvidia顯卡的原因會出現一些問題,結果在我自己裝了之後發現問題要比看到的多,再看了無數個帖子之後,最終在昨晚完美收官,也是筆者想寫這個帖子的原因,想寫一個最新的版本,希望後來的看管能一次性搞定,跳過我踩 ...
  • 本人是一名實習生,最近在學習Linux,在實操的過程中還是遇到了一些問題,所以想記錄下來,供自己以後複習,也希望能給跟我一樣的菜鳥的人帶來一點點幫助。 我用的是VMware Workstation Pro這個虛擬機,在這個虛擬機上面裝的是Centos 7.5,版本是比較新的,但其實7.X的版本的東西 ...
  • 實現批量修改目標主機多個用戶密碼: 以非root用戶連接目標主機通過 sudo執行 劇本: ansible-playbook play.yml --user=app --private-key=/home/app/.ssh/id_rsa -b 解析:-b 是 become -s 是舊版本的sudo ...
  • FTP 伺服器架設: 1. 關閉防火牆 2. 關閉SELinux 3. 安裝所需依賴及編譯工具 4. 下載pure ftpd 5. 解壓 6. 進行配置 7. 編譯和安裝 8. 修改配置文件 9. 控制文件 10. 啟動服務 11. 添加管理用戶 12. 創建虛擬的用戶資料庫 13. 通過ftp連接 ...
  • MySQL資料庫是一款比較常用的資料庫,大家在練習安裝時,可能會遇到各種各樣的問題,請大家參考在CentOS系統下MySQL資料庫的安裝方式。如有任何問題,歡迎留言,本人隨時解答。 MySQL安裝步驟如下: 第一步:上傳 MySQL二進位安裝包 MySQL版本:5.6.3 下載鏈接:https:// ...
  • 1、使用索引的已有順序 2、filesort演算法 filesort演算法的執行流程 filesort相關的參數 sort_buffer_size 演算法排序緩衝區的大小,線程級緩存 max_length_for_sort_data 決定選擇那種不同的策略進行排序(兩種排序演算法) 1、two-pass演算法 ...
  • mysql優化–explain分析sql語句執行效率 Explain命令在解決資料庫性能上是第一推薦使用命令,大部分的性能問題可以通過此命令來簡單的解決,Explain可以用來查看SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain ...
  • 正文 之前的博文當中提到備份工具mydumper的使用,而軟體包中還包含了與之對應的恢復工具myloader,本文就總結下myloader的用法。關於mydumper的安裝與使用可以參考之前的博文:[MySQL Backup mydumper][1]。 查看myloader的版本信息: 主要選項 d ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...