關於動態SQL

2021-08-30 20:52:21 字數 2775 閱讀 3129

目前在oracle開發過程中,我所用到的動態sql的一點心得。 我把它分為form級、table級和pl/sql級。

1》form級 方法一:

forms_ddl:支援pl/sql和部分ddl 建表:forms_ddl('create table temp(n number)'); 刪表:forms_ddl('drop table temp'); 刪除記錄:forms_ddl('delete from temp'); 執行pl/sql:forms_ddl('begin '||過程名||'; end;');

**注意判斷是否執行成功,通過form_success or form_failure來判斷。

2》table級別 方法一:dbms_sql. 建表,刪表,更新記錄等操作,基本類似,我舉乙個建表的例子:

declare

cursor_name integer;

ret integer;

begin

cursor_name:=dbms_sql.open_cursor;

dbms_sql.parse(cursor_name, 'create table test_2(name varchar2(8))', dbms_sql.native);

ret := dbms_sql.execute(cursor_name);

dbms_sql.close_cursor(cursor_name);

end; 查詢資料:

declare

cursor_name integer;

ret integer;

v_1 varchar2(10);

v_2 number;

begin

cursor_name:=dbms_sql.open_cursor;

dbms_sql.parse(cursor_name, 'select ''test'' ,783426 from dual', dbms_sql.native);

dbms_sql.define_column(cursor_name, 1, v_1,10);

dbms_sql.define_column(cursor_name, 2, v_2);

ret := dbms_sql.execute(cursor_name);

if dbms_sql.fetch_rows(cursor_name)>0 then

dbms_sql.column_value(cursor_name, 1, v_1);

dbms_sql.column_value(cursor_name, 2, v_2);

dbms_output.put_line('第乙個值:'||v_1);

dbms_output.put_line('第二個值:'||to_char(v_2));

end if;

dbms_sql.close_cursor(cursor_name);

end ;

***最簡單的判斷執行是否成功,利用trap exception.

方法二:execute immediate

8版以上資料庫,相當好用的乙個東東,我常用。 建表,刪表類似:

declare

begin

execute immediate 'drop table temp_1';

execute immediate 'create table temp_1(name varchar2(8))';

end ; 增加資料

declare

v_1 varchar2(8);

v_2 varchar2(10);

str varchar2(50);

begin

v_1:='測試人員';

v_2:='北京';

str := 'insert into test (name ,address) values (:1, :2)';

execute immediate str using v_1, v_2;

commit;

end;

查詢資料:

declare

str varchar2(500);

c_1 varchar2(10);

r_1 test%rowtype;

begin

c_1:='測試人員';

str:='select * from test where name=:c where rownum=1';

execute immediate str into r_1 using c_1;

dbms_output.put_line(r_1.name||r_1.address);

end ;

3》pl/sql級別 我僅僅用於查詢。 例:

declare

type mycursor is ref cursor;

cursor_1 mycursor;

r_1 test%rowtype;

str varchar2(100);

begin

str := 'select * from test';

open cursor_1 for str;

loop

fetch cursor_1 into r_1;

exit when emp_cv%notfound;

dbms_output.put_line(r_1.name);

end loop;

close cursor_1;

end;

問題5 關於動態SQL查詢

問題描述 求一儲存過程,取得指定表中最大的id號,這裡的表是引數 解答 create procedure selectmax max int output,tablename varchar 50 as 注意,此處不能直接寫成 exec select max max id from tablenam...

關於動態sql的子查詢

工作中遇到了乙個查詢需求,想查出來的資料結構是這樣的 list selectstudentinfo student的結構是這樣的 public class student public class report 可以用以下動態sql完成 studentmap type student id prop...

動態sql 為什麼需要動態SQL

在使用ef或者寫sql語句時,查詢條件往往是這樣一種非常常見的邏輯 如果客戶填了查詢資訊,則查詢該條件 如果客戶沒填,則返回所有資料。我常常看到很多人解決這類問題時使用了錯誤的靜態sql的解決辦法,使得資料庫無法利用索引,導致效能急劇下降。這次我將使用我的某客戶的真實資料來演示 已確認不涉及資訊保安...