<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    PL/SQL開發中動態SQL的使用方法(zhuan)

    一般的PL/SQL程序設計中,在DML和事務控制的語句中可以直接使用SQL,但是DDL語句及系統控制語句卻不能在PL/SQL中直接使用,要想實現在PL/SQL中使用DDL語句及系統控制語句,可以通過使用動態SQL來實現。

      首先我們應該了解什么是動態SQL,在Oracle數據庫開發PL/SQL塊中我們使用的SQL分為:靜態SQL語句和動態SQL語句。所謂靜態SQL指在PL/SQL塊中使用的SQL語句在編譯時是明確的,執行的是確定對象。而動態SQL是指在PL/SQL塊編譯時SQL語句是不確定的,如根據用戶輸入的參數的不同而執行不同的操作。編譯程序對動態語句部分不進行處理,只是在程序運行時動態地創建語句、對語句進行語法分析并執行該語句。

      Oracle中動態SQL可以通過本地動態SQL來執行,也可以通過DBMS_SQL包來執行。下面就這兩種情況分別進行說明:

      一、本地動態SQL
      本地動態SQL是使用EXECUTE IMMEDIATE語句來實現的。

      1、本地動態SQL執行DDL語句:
      需求:根據用戶輸入的表名及字段名等參數動態建表。
    create or replace procedure proc_test
      (
      table_name in varchar2, --表名
      field1 in varchar2, --字段名
      datatype1 in varchar2, --字段類型
      field2 in varchar2, --字段名
      datatype2 in varchar2 --字段類型
      ) as
      str_sql varchar2(500);
      begin
      str_sql:=’create table ’||table_name||’(’||field1||’ ’||datatype1||’,’||field2||’ ’||datatype2||’)’;
      execute immediate str_sql; --動態執行DDL語句
      exception
      when others then
      null;
      end ;
      以上是編譯通過的存儲過程代碼。下面執行存儲過程動態建表?! ?br />
    SQL> execute proc_test(’dinya_test’,’id’,’number(8) not null’,’name’,’varchar2(100)’);
      PL/SQL procedure successfully completed
      SQL> desc dinya_test;
      Name Type Nullable Default Comments
      ---- ------------- -------- ------- --------
      ID NUMBER(8)
      NAME VARCHAR2(100) Y
      SQL>

      到這里,就實現了我們的需求,使用本地動態SQL根據用戶輸入的表名及字段名、字段類型等參數來實現動態執行DDL語句。

      2、本地動態SQL執行DML語句。
      需求:將用戶輸入的值插入到上例中建好的dinya_test表中。  
    create or replace procedure proc_insert
      (
      id in number, --輸入序號
      name in varchar2 --輸入姓名
      ) as
      str_sql varchar2(500);
      begin
      str_sql:=’insert into dinya_test values(:1,:2)’;
      execute immediate str_sql using id,name; --動態執行插入操作
      exception
      when others then
      null;
      end ;
      執行存儲過程,插入數據到測試表中。
      SQL> execute proc_insert(1,’dinya’);
      PL/SQL procedure successfully completed
      SQL>select * from dinya_test;
      ID NAME
      1 dinya
      在上例中,本地動態SQL執行DML語句時使用了using子句,按順序將輸入的值綁定到變量,如果需要輸出參數,可以在執行動態SQL的時候,使用RETURNING INTO 子句,如: 
    declare
      p_id number:=1;
      v_count number;
      begin
      v_string:=’select count(*) from table_name a where a.id=:id’;
      execute immediate v_string into v_count using p_id;
      end ;
      更多的關于動態SQL中關于返回值及為輸出輸入綁定變量執行參數模式的問題,請讀者自行做測試。

      二、使用DBMS_SQL包
      使用DBMS_SQL包實現動態SQL的步驟如下:A、先將要執行的SQL語句或一個語句塊放到一個字符串變量中。B、使用DBMS_SQL包的parse過程來分析該字符串。C、使用DBMS_SQL包的bind_variable過程來綁定變量。D、使用DBMS_SQL包的execute函數來執行語句。

      1、使用DBMS_SQL包執行DDL語句
      需求:使用DBMS_SQL包根據用戶輸入的表名、字段名及字段類型建表。
    create or replace procedure proc_dbms_sql
      (
      table_name in varchar2, --表名
      field_name1 in varchar2, --字段名
      datatype1 in varchar2, --字段類型
      field_name2 in varchar2, --字段名
      datatype2 in varchar2 --字段類型
      )as
      v_cursor number; --定義光標
      v_string varchar2(200); --定義字符串變量
      v_row number; --行數
      begin
      v_cursor:=dbms_sql.open_cursor; --為處理打開光標
      v_string:=’create table ’||table_name||’(’||field_name1||’ ’||datatype1||’,’||field_name2||’ ’||datatype2||’)’;
      dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析語句
      v_row:=dbms_sql.execute(v_cursor); --執行語句
      dbms_sql.close_cursor(v_cursor); --關閉光標
      exception
      when others then
      dbms_sql.close_cursor(v_cursor); --關閉光標
      raise;
      end;

      以上過程編譯通過后,執行過程創建表結構:

    SQL> execute proc_dbms_sql(’dinya_test2’,’id’,’number(8) not null’,’name’,’varchar2(100)’);
      PL/SQL procedure successfully completed
      SQL> desc dinya_test2;
      Name Type Nullable Default Comments
      ---- ------------- -------- ------- --------
      ID NUMBER(8)
      NAME VARCHAR2(100) Y
      SQL>

      2、使用DBMS_SQL包執行DML語句
      需求:使用DBMS_SQL包根據用戶輸入的值更新表中相對應的記錄。

      查看表中已有記錄: 

    SQL>select * from dinya_test2;
      ID NAME
      1 Oracle
      2 CSDN
      3 ERP
      SQL>

    建存儲過程,并編譯通過:  

    create or replace procedure proc_dbms_sql_update
      (
      id number,
      name varchar2
      )as
      v_cursor number; --定義光標
      v_string varchar2(200); --字符串變量
      v_row number; --行數
      begin
      v_cursor:=dbms_sql.open_cursor; --為處理打開光標
      v_string:=’update dinya_test2 a set a.name=:p_name where a.id=:p_id’;
      dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析語句
      dbms_sql.bind_variable(v_cursor,’:p_name’,name); --綁定變量
      dbms_sql.bind_variable(v_cursor,’:p_id’,id); --綁定變量
      v_row:=dbms_sql.execute(v_cursor);            --執行動態SQL
      dbms_sql.close_cursor(v_cursor); --關閉光標
      exception
      when others then
      dbms_sql.close_cursor(v_cursor); --關閉光標
      raise;
      end;
      執行過程,根據用戶輸入的參數更新表中的數據:  

    SQL> execute proc_dbms_sql_update(2,’csdn_dinya’);
      PL/SQL procedure successfully completed
      SQL>select * from dinya_test2;
      ID NAME
      1 Oracle
      2 csdn_dinya
      3 ERP
      SQL>
     
      執行過程后將第二條的name字段的數據更新為新值csdn_dinya。這樣就完成了使用dbms_sql包來執行DML語句的功能。

      使用DBMS_SQL中,如果要執行的動態語句不是查詢語句,使用DBMS_SQL.Execute或DBMS_SQL.Variable_Value來執行,如果要執行動態語句是查詢語句,則要使用DBMS_SQL.define_column定義輸出變量,然后使用DBMS_SQL.Execute, DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及DBMS_SQL.Variable_Value來執行查詢并得到結果。

      總結說明:

      在Oracle開發過程中,我們可以使用動態SQL來執行DDL語句、DML語句、事務控制語句及系統控制語句。但是需要注意的是,PL/SQL塊中使用動態SQL執行DDL語句的時候與別的不同,在DDL中使用綁定變量是非法的(bind_variable(v_cursor,’:p_name’,name)),分析后不需要執行DBMS_SQL.Bind_Variable,直接將輸入的變量加到字符串中即可。另外,DDL是在調用DBMS_SQL.PARSE時執行的,所以DBMS_SQL.EXECUTE也可以不用,即在上例中的v_row:=dbms_sql.execute(v_cursor)部分可以不要。

    posted on 2007-10-17 08:57 都市淘沙者 閱讀(295) 評論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

    主站蜘蛛池模板: 亚洲中文字幕丝袜制服一区| 久久被窝电影亚洲爽爽爽| 特级毛片在线大全免费播放| 中文字幕精品亚洲无线码一区| 最近中文字幕无免费| 蜜芽亚洲av无码一区二区三区| 亚洲日韩国产成网在线观看| 足恋玩丝袜脚视频免费网站| 校园亚洲春色另类小说合集 | 亚洲av无码一区二区乱子伦as| 最近免费中文字幕mv电影| 国产精品亚洲精品青青青| 五月婷婷亚洲综合| 1000部啪啪毛片免费看| 无套内射无矿码免费看黄| 亚洲精品视频在线观看免费| 亚洲国产精品激情在线观看| 免费无码AV片在线观看软件| 久久久久久av无码免费看大片| 亚洲国产一区在线观看| 亚洲色精品aⅴ一区区三区| 毛片网站免费在线观看| 特级无码毛片免费视频尤物 | 农村寡妇一级毛片免费看视频| 亚洲日韩国产精品无码av| 在线涩涩免费观看国产精品| 亚洲成av人片天堂网无码】| 亚洲激情视频网站| 亚洲无线码一区二区三区| 国产精品jizz在线观看免费| 亚洲一区二区三区免费视频| 一级一级毛片免费播放| 亚洲人成图片网站| 久久亚洲日韩看片无码| 亚洲av永久无码精品网站| 亚洲精品久久久www| 日韩成人免费aa在线看| 一区二区无码免费视频网站| 91精品免费不卡在线观看| 久久久精品免费国产四虎| 和老外3p爽粗大免费视频|