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

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

          ?

          DBMS_SQL 與本地動態(tài) SQL 比較

          1、? 動態(tài) 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、??? 以字符串的形式構造動態(tài) SQL 語句

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

          3、??? 解板動態(tài)構造的 SQL 語句,把該 SQL 語句與游標句柄關聯(lián)。

          4、??? 執(zhí)行 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? /

          ?

          本地動態(tài) SQL 語句

          關于動態(tài) DDL DML 和會話控制的本地動態(tài) 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 < 參數 >

          動態(tài) DDL

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

          1 Execute immediate <dyn_string>

          2 Execute immediate <dum_string> using < 參數 >

          ?

          一個使用動態(tài) DDL 創(chuàng)建表的存儲過程

          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;

          ?

          動態(tài) 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;

          動態(tài) INSERT UPDATE DELETE

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

          ?????? Execute immediate <dyn_string>

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

          ?

          posted on 2006-09-28 16:26 有貓相伴的日子 閱讀(725) 評論(0)  編輯  收藏 所屬分類: pl/sql
          本站不再更新,歡迎光臨 java開發(fā)技術網
          主站蜘蛛池模板: 垫江县| 庐江县| 望都县| 盘山县| 高州市| 香河县| 林芝县| 凭祥市| 磐安县| 台江县| 顺义区| 竹溪县| 鲁甸县| 乐亭县| 绥中县| 新乡县| 南宁市| 玉林市| 桂平市| 永福县| 清流县| 民权县| 陆丰市| 长岛县| 荥阳市| 闸北区| 沿河| 和静县| 伊吾县| 北辰区| 凤山县| 阿拉善右旗| 柘城县| 游戏| 仁怀市| 深圳市| 吉木乃县| 德格县| 甘南县| 上饶县| 双桥区|