本站不再更新,歡迎光臨 java開發技術網
          隨筆-230  評論-230  文章-8  trackbacks-0

          Oracle 支持兩種類型 SQL: 靜態 SQL 和動態 SQL 。在靜態 SQL 中, SQL 語句在編譯時就已經全部確定,語法和語義的引用問題也是在編譯時全部解析確定。在動態 SQL 中, SQL 語句是由字符串組成的,在運行時動態執行。動態 PL/SQL 也是如此。

          ?

          DBMS_SQL 與本地動態 SQL 比較

          1、? 動態 SQL 語句最長度限制在 32K 以內。比這個長的語句就只能用 DBMS_SQL 來處理 .

          2、? 還有很多。。省略

          一個最簡單的例子 :

          SQL>? declare

          ? 2????? dyn_tab_name varchar2(20):='t_temp';

          ? 3????? dyn_string varchar2(150);

          ? 4?? begin

          ? 5???? dyn_string:='create table '||dyn_tab_name||' (colA number not null)';

          ? 6???? execute immediate dyn_string;

          ? 7? end;

          ? 8? /

          使用 DBMS_SQL 的過程包括以下五個步驟

          1、??? 以字符串的形式構造動態 SQL 語句

          2、??? 專用明游標句柄并為該句柄打開游標

          3、??? 解板動態構造的 SQL 語句,把該 SQL 語句與游標句柄關聯。

          4、??? 執行 SQL 語句

          5、??? 關閉游標

          SQL> declare

          ? 2????????? dyn_tab_name varchar2(20):='t_temp';

          ? 3????????? dyn_string varchar2(150);

          ? 4????????? c ? integer;

          ? 5????????? ret_code integer;

          ? 6????? begin

          ? 7??????? dyn_string:='create table '||dyn_tab_name||'( colA number not null)';

          ? 8??????? c:=dbms_sql.open_cursor;

          ? 9?????? dbms_sql.parse(c,dyn_string,dbms_sql.v7);

          ?10?????? ret_code:=dbms_sql.execute(c);

          ?11?????? dbms_sql.close_cursor(c);

          ?12???? end;

          ?13? /

          ?

          本地動態 SQL 語句

          關于動態 DDL DML 和會話控制的本地動態 SQL 語句如下所示

          1、? Execute immediate <dyn_string>

          2、? Execute immediate <dum_string> using < 參數 >

          3、? Execute immediate <dyn_string>into <index-by array 、嵌套表 >using< 參數 >

          4、? Open cursor for <dyn_string>

          5、? Open cursor form <dyn_string>? using < 參數 >

          6、? Close <cursor>

          7、? Execute immediate ‘begin…..end’ using < 參數 >

          動態 DDL

          動態 DDL 處理的是使用運行時為數據庫對象提供的值的 DDL 語句。動態 DDL 一個典型的用法就是,創建僅在運行時表名和列名才可用的一個動態表。可以使用以下 DDL 語句 :

          1 Execute immediate <dyn_string>

          2 Execute immediate <dum_string> using < 參數 >

          ?

          一個使用動態 DDL 創建表的存儲過程

          create or replace procedure dyn_ddl_demo(tablename varchar2,errnum? outnumber,errtext outvarchar2)
          authidcurrent_user
          is
          ? dyn_string varchar2(
          1000 );
          ? dyn_tablename varchar2(
          30 );
          begin
          ? dyn_tablename:=tablename;
          ? dyn_string:=
          'create table ' ||dyn_tablename||
          ?
          '(order_id number(10) primary key,
          ??? order_date date not null,
          ??? total_qty number,
          ??? total_price number(15,2)
          ?? )'
          ;
          ?? dbms_output.put_line(
          'dyn_string--->' ||dyn_string);
          ?? executeimmediate dyn_string;
          ?? errnum:=
          0 ;
          exception
          ?? whenothersthen
          ????? errnum:=sqlcode;
          ????? errtext:=
          'ERR: Create table ' ||dyn_tablename|| '---' ||sqlerrm;
          end dyn_ddl_demo;

          ?

          動態 SELECTS

          查詢可以返回一行記錄或多行記錄。多行記錄的在《本地批綁定》里再介紹

          單行 Selects

          Execute immediate <dyn_string> into < 變量 > using < 參數 >

          :

          create or replace procedure dyn_selects(
          vid number,
          errnum outnumber,
          errtext outvarchar2)
          is
          ? sql_string varchar2(
          500 );
          ? id number;
          ? uname varchar2(
          200 );
          ? sex varchar2(
          2 );
          ?
          ? upd_string varchar2(
          500 );
          ? vname varchar2(
          200 );
          ? vsex varchar2(
          2 );
          ? vvid number;
          begin
          ? sql_string :=
          'select * from t_user where id=:vid' ;
          ? executeimmediate sql_string into id,uname,sex using vid;
          ? dbms_output.put_line(id||
          '----' ||uname|| '----' ||sex);
          ?
          ? upd_string:=
          'update t_user set name=:vname,sex=:vsex where id=:vvid' ;
          ? vname:=
          ' 傻瓜 ' ;
          ? vsex:=
          'xx' ;
          ? vvid:=
          3 ;
          ?
          ? executeimmediate upd_string using vname,vsex,vvid;
          ? errnum:=
          0 ;
          exception
          ? whenothersthen
          ???? errnum:=sqlcode;
          ???? errtext:=sqlerrm;
          end dyn_selects;

          動態 INSERT UPDATE DELETE

          除了 DDL 語句和 DML 的單 SELECT 語句以外,還能動態地構造 INSERT UPDATE DELETE 語句并在運行時執行它們。可以使用以下語句執行 insert,update,delete 語句

          ?????? Execute immediate <dyn_string>

          ??? Execute immediate <dyn_string> into < 變量 > using < 參數 >

          ?

          posted on 2006-09-28 16:26 有貓相伴的日子 閱讀(725) 評論(0)  編輯  收藏 所屬分類: pl/sql
          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(32)

          隨筆分類(222)

          隨筆檔案(224)

          文章分類(4)

          文章檔案(7)

          相冊

          收藏夾(4)

          最新評論

          閱讀排行榜

          評論排行榜

          本站不再更新,歡迎光臨 java開發技術網
          主站蜘蛛池模板: 鄂托克旗| 平和县| 灵丘县| 潍坊市| 昌吉市| 福安市| 阳新县| 贵州省| 金寨县| 正镶白旗| 武冈市| 斗六市| 江源县| 固镇县| 安吉县| 垦利县| 丰县| 渑池县| 岳阳市| 庄河市| 芮城县| 独山县| 南阳市| 洪泽县| 龙胜| 汉川市| 星座| 鄢陵县| 岐山县| 嘉善县| 汉阴县| 榆社县| 金门县| 仁怀市| 本溪| 阿鲁科尔沁旗| 昌黎县| 江山市| 巩义市| 东海县| 郯城县|