Oracle 动态sql(二)

-- Created on 2019/4/10 by IRIS.ZHOU 
--使用dbms_sql實現動態sql

/**
TYPE binary_double_table IS TABLE OF BINARY_DOUBLE  INDEX BY BINARY_INTEGER;
TYPE binary_float_table IS TABLE OF BINARY_FLOAT   INDEX BY BINARY_INTEGER;
TYPE bfile_table    IS TABLE OF BFILE          INDEX BY BINARY_INTEGER;
TYPE blob_table     IS TABLE OF BLOB           INDEX BY BINARY_INTEGER;
TYPE clob_table     IS TABLE OF CLOB           INDEX BY BINARY_INTEGER;
TYPE date_table     IS TABLE OF DATE           INDEX BY BINARY_INTEGER;
TYPE interval_day_to_second_Table IS TABLE OF dsinterval_unconstrained INDEX BY BINARY_INTEGER;
TYPE interval_year_to_MONTH_Table IS TABLE OF yminterval_unconstrained  INDEX BY BINARY_INTEGER;
TYPE number_table   IS TABLE OF NUMBER         INDEX BY BINARY_INTEGER;
TYPE time_table     IS TABLE OF time_unconstrained INDEX BY BINARY_INTEGER;
TYPE time_with_time_zone_table IS TABLE OF time_tz_unconstrained INDEX BY BINARY_INTEGER;
TYPE timestamp_table  IS TABLE OF timestamp_unconstrained INDEX BY BINARY_INTEGER;
TYPE timestamp_with_ltz_Table  IS TABLE OF timestamp_ltz_unconstrained INDEX BY BINARY_INTEGER;
TYPE timestamp_with_time_zone_Table  IS TABLE OF timestamp_tz_unconstrained  INDEX BY BINARY_INTEGER;
TYPE urowid_table   IS TABLE OF UROWID         INDEX BY BINARY_INTEGER;
TYPE varchar2_table IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
**/

/**
declare 
  mysqlsel varchar2(200);
  mysqlins varchar2(200);
  sar number(10):=2000;
  num integer;
  c_name emp1.name%type;
  c_did emp1.did%type;
  c integer;
  e_num integer;
begin
 
  mysqlsel:='select e.name,e.did from emp1 e where e.sar>:sar';
  c:=dbms_sql.open_cursor;
  dbms_sql.parse(c,mysqlsel,dbms_sql.native);
  
  -- dbms_sql.define_column(c,position,column in <datatype>);
  -- dbms_sql.define_column(c,position,column in char/varchar2  character set any_cs);
  dbms_sql.define_column(c,1,c_name,20);--varchar2類型需要column_size
  dbms_sql.define_column(c,2,c_did);--number類型不需要column_size
  
  dbms_sql.bind_variable(c,':sar',sar);--mysqlsel中無參數可以省略
  
  --必須定義一個參數接受結果
  e_num:=dbms_sql.execute(c);
  while dbms_sql.fetch_rows(c)>0 loop--獲取一行
  
  
  --將前面定義的字段返回給變量       
  dbms_sql.column_value(c,1,c_name);--dbms_sql.column_value(c IN INTEGER,position IN INTEGER,value OUT <datatype>);
  dbms_sql.column_value(c,2,c_did);
  
  dbms_output.put_line(c_name||' '||c_did);
       
  end loop; 
  
  dbms_sql.close_cursor(c);
end;
**/


/**
--使用 define_array 方法得到查询结果 
declare 
  mysqlsel varchar2(200);
  mysqlins varchar2(200);
  sar number(10):=2000;
  num integer;
  c_name dbms_sql.Number_Table;
  c_did dbms_sql.Number_Table;
  c integer;
  e_num integer;
  indx number:=1;
begin
 
  mysqlsel:='select e.did from emp1 e where e.sar>:sar';
  c:=dbms_sql.open_cursor;
  dbms_sql.parse(c,mysqlsel,dbms_sql.native);
  
 --DBMS_SQL.DEFINE_ARRAY (c IN INTEGER, position IN INTEGER, <table_variable> IN <datatype>, cnt IN INTEGER, lower_bnd IN INTEGER);
  dbms_sql.define_array(c,1,c_did,9,indx);
  
  dbms_sql.bind_variable(c,':sar',sar);--mysqlsel中無參數可以省略
  
  --必須定義一個參數接受結果
  e_num:=dbms_sql.execute(c);

   e_num:=dbms_sql.fetch_rows(c);
   dbms_output.put_line('fetch rows is ' || e_num);
    
   if e_num<9 then
   dbms_sql.column_value(c,1, c_did);
 
   for i in 1..e_num loop
      dbms_output.put_line(c_did(i));    
   end loop; 
   end if;

  dbms_sql.close_cursor(c);
  
  exception
    when others then 
      dbms_output.put_line('errors1:'||sqlerrm);
      dbms_output.put_line('errors1:'||sqlcode||' and '||dbms_utility.format_error_stack);
      dbms_output.put_line('errors2:'||sqlcode||' and '||dbms_utility.format_call_stack);
      dbms_output.put_line('errors3:'||sqlcode||' and '||dbms_utility.format_error_backtrace);
end;
**/

/**
--使用 variable_value
declare 
  a emp1.name%type:='name10';   
  b emp1.did%type:=6;   
  r emp1.did%type;   

  num integer;
  c integer:=dbms_sql.open_cursor;

begin

  dbms_sql.parse(c
           ,'insert into emp1(name,did) values(:a,:b) return :b*:b into :r'
           ,dbms_sql.native);
  
  dbms_sql.bind_variable(c,':a',a);
  dbms_sql.bind_variable(c,':b',b);
  dbms_sql.bind_variable(c,':r',r);
  
  num:=dbms_sql.execute(c);
  --使用variable_value函数得到DML操作returning的结果集 
  dbms_sql.variable_value(c,'r',r);
  dbms_output.put_line(r);

  dbms_sql.close_cursor(c);
  
  exception
    when others then 
      dbms_output.put_line('errors1:'||sqlerrm);
      dbms_output.put_line('errors1:'||sqlcode||' and '||dbms_utility.format_error_stack);
      dbms_output.put_line('errors2:'||sqlcode||' and '||dbms_utility.format_call_stack);
      dbms_output.put_line('errors3:'||sqlcode||' and '||dbms_utility.format_error_backtrace);
end;
**/

--dbms_sql與原生sql的切換
--to_cursor_number();
--to_refcursor();
declare 
  ref_c sys_refcursor; 
  myname emp1.name%type;
  num integer;
  c integer:=dbms_sql.open_cursor;

begin

  dbms_sql.parse(c
           ,'select name from emp1'
           ,dbms_sql.native);
  
  num:=dbms_sql.execute(c);
 
  ref_c:=dbms_sql.to_refcursor(c);

  loop
    fetch ref_c into myname;
    if ref_c%found then
    dbms_output.put_line(myname);
    else
     exit; 
    end if;
  end loop;
  
  exception
    when others then 
      dbms_output.put_line('errors1:'||sqlerrm);
      dbms_output.put_line('errors1:'||sqlcode||' and '||dbms_utility.format_error_stack);
      dbms_output.put_line('errors2:'||sqlcode||' and '||dbms_utility.format_call_stack);
      dbms_output.put_line('errors3:'||sqlcode||' and '||dbms_utility.format_error_backtrace);
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知道叫什麽名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值