oracle 動態sql 繫結變數

2021-09-01 01:27:35 字數 2850 閱讀 3891

--無繫結變數的非sql查詢

declare

v_sql varchar2(4000);

begin --使用execute immediate執行動態sql,最後提交事物

v_sql := 'create table account('||' id number(3) not null,'||

'name varchar2(50) not null,'||' balance number(8,2) not null,'||

' btime date not null)';

execute immediate v_sql;

v_sql :='insert into account (id,name,balance,btime)'||

' values (1,''張三'',2000.1,to_date(''12-02-2008'',''dd-mm-yyyy''))';

execute immediate v_sql;

v_sql :='insert into account (id,name,balance,btime)'||

' values (2,''李四'',530,to_date(''10-12-2008'',''dd-mm-yyyy''))';

execute immediate v_sql;

v_sql :='insert into account (id,name,balance,btime)'||

' values (3,''王五'',1631,to_date(''11-05-2007'',''dd-mm-yyyy''))';

execute immediate v_sql;

v_sql :='insert into account (id,name,balance,btime)'||

' values (4,''小強'',910.3,to_date(''12-04-2008'',''dd-mm-yyyy''))';

execute immediate v_sql;

v_sql :='insert into account (id,name,balance,btime)'||

' values (5,''小周'',8700,to_date(''11-11-2008'',''dd-mm-yyyy''))';

execute immediate v_sql;

exception

when others then

dbms_output.put_line(sqlerrm);

end;

drop table account

--帶固定數目繫結變數的非sql查詢

declare

v_sql varchar2(4000);

v_balance account.balance%type;

v_name account.name%type;

begin --使用excute immediate語句執行sql字串,使用using將繫結變數與輸入的id和賬戶金額進行繫結,

--將更新後的賬戶名稱與賬戶餘額返回到變數中

v_sql := 'update account set balance=:balance where id=:id'||

' returning name,balance into:1,:2';

execute immediate v_sql

using &balance,&id --把繫結引數的值傳給繫結變數在sql語句中分別有指定

returning into v_name, v_balance; --返回的資料傳給兩個定義變數

if sql%notfound then --假如沒找到就丟擲乙個異常

end if;

commit;

dbms_output.put_line(v_name || ' ' || v_balance);

exception

when others then

dbms_output.put_line(sqlerrm);

end;

--帶固定數目列和繫結變數的sql查詢

declare

type account_table_type is table of account%rowtype index by binary_integer;

account_table account_table_type;

account_cursor sys_refcursor;

v_sql varchar2(4000);

begin

v_sql := 'select * from account where to_char(btime,''yyyy'') = :year'; --通過年份使用繫結變數

open account_cursor for v_sql using &year; --open。。for執行sql字串,使用using進行變數繫結

fetch account_cursor bulk collect into account_table; --執行下一條

if account_table.count = 0 then --集合長度等於0就丟擲異常

end if;

for i in 1..account_table.count loop --把集合中內容列印出來

dbms_output.put_line(account_table(i).name || ' ' || account_table(i).balance);

end loop;

close account_cursor; --關閉游標

exception

when others then

dbms_output.put_line(sqlerrm);

end;

oracle動態sql以及繫結變數

實現動態sql有兩種方式 dbms sql和本地動態sql execute immeidate oracle從8代開始就提供了新的執行動態sql的功能 execute immeidate v sql using into 本地動態sql execute immediate 語句 into using...

oracle動態SQL繫結集合變數

有如下需求,在儲存過程中,傳遞的引數是字串,字串格式是 1,2,3 由數字組成,中間用 號分割 然後在sql語句如下使用 create or replace procedure movetoright v ids varchar2,v workid int asi sql varchar2 1000...

SQL Server動態SQL與變數繫結

有時候動態sql需要進行變數的賦值,這個時候就需要呼叫系統的儲存過程sp executesql了。使用中還是有些注意事項,如下 字元型字段需宣告為nvarchar型別 declare strsql nvarchar 1000 value str nvarchar 254 動態sql拼接 set st...