Oracle12c——function(1)

         ------Oracle12c  动态查询------
CREATE OR REPLACE FUNCTION F_cursor_select (p_no in varchar2)
        RETURN VARCHAR2
                     AS 
                     row_process    varchar2(60);
                     v_a           varchar2(20);
                     v_b           varchar2(20);
                     v_c           NUMBER;
                     v_d           NUMBER;
                     v_cursor       NUMBER;
                    -- p_no           varchar2(20);
BEGIN
  v_cursor := dbms_sql.open_cursor;  --打开游标
 -- p_no     :='10';
  begin
    --动态解析sql语句
    dbms_sql.parse(v_cursor,
                   'select stuid,stuname,sex,age from stuinfo  where stuid= :no',
                   dbms_sql.native);
    --绑定输入参数;
    dbms_sql.bind_variable(v_cursor,':no',p_no);
     --定义列
    --如果是char或者varchar2类型,则必须指定最后一个参数(制定字符串类型的长度,为BYTE)
    --SIMPLIFIED CHINESE_CHINA.ZHS16GBK     :   一个汉字占用两个字节
    --SIMPLIFIED CHINESE_CHINA.AL32UTF8     :   一个汉字占用三个字节
    dbms_sql.define_column(v_cursor, 1, v_a,10);
    dbms_sql.define_column(v_cursor, 2, v_b,10);
    dbms_sql.define_column(v_cursor, 3, v_c);
    dbms_sql.define_column(v_cursor, 4, v_d);
    --执行动态SQL语句
    row_process := dbms_sql.execute(v_cursor);
    LOOP
      --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1
      IF (dbms_sql.fetch_rows(v_cursor)) > 0 THEN
        --将当前行的查询结果写入上面定义的列中。
        dbms_sql.column_value(v_cursor,1,v_a);
        dbms_sql.column_value(v_cursor,2,v_b);
        dbms_sql.column_value(v_cursor,3,v_c);
        dbms_sql.column_value(v_cursor,4,v_d);
        --打印输出
        dbms_output.put_line(';'||row_process||';');
      ELSE
        EXIT;
        
      END IF;
    END LOOP;
    --关闭游标
    dbms_sql.close_cursor(v_cursor);
    commit;
    return v_a || ';' || v_b || ';' || v_c || ';' || v_d;
  end;
END F_cursor_select;
         ------Oracle12c  动态插入------
CREATE OR REPLACE FUNCTION F_cursor_insert (b_stuid in varchar2,b_stuname in varchar2,b_sex in number,b_age in number)
        RETURN VARCHAR2   AS
                     row_process    varchar2(10);
                     v_cursor       NUMBER;
                     v_sql         varchar2(200);
                   --  b_stuid       varchar2(20);
                   --  b_stuname     varchar2(20);
                   --  b_sex         number;
                   --  b_age         number;
BEGIN
  --b_stuid = '70';
  --b_stuname = '龙泣';
  --b_sex = 1;
  --b_age = 17;
  v_cursor := dbms_sql.open_cursor;
  v_sql := 'insert into stuinfo (stuid,stuname,sex,age) values
            (:p_stuid,:p_stuname,:p_sex,:p_age)';
  
  begin

      dbms_sql.parse(v_cursor,
                     v_sql,
                     dbms_sql.native);
     
      dbms_sql.bind_variable(v_cursor,':p_stuid',b_stuid);
      dbms_sql.bind_variable(v_cursor,':p_stuname',b_stuname);
      dbms_sql.bind_variable(v_cursor,':p_sex',b_sex);
      dbms_sql.bind_variable(v_cursor,':p_age',b_age);

      row_process := dbms_sql.execute(v_cursor);

      dbms_sql.close_cursor(v_cursor);
      commit;
      return  row_process;
  end;
END F_cursor_insert;
                 -------动态更新------
CREATE OR REPLACE FUNCTION F_cursor_update (b_stuid in varchar2,b_stuname in varchar2,b_age in number)
        RETURN VARCHAR2   AS
                     row_process   varchar2(10);
                     v_cursor      NUMBER;
                     v_sql         varchar2(300);
                     --b_stuid       varchar2(10);
                     --b_stuname     varchar2(10);
                     --b_age         NUMBER;
BEGIN
  --b_stuid := 10;
  --b_stuname := '10';
  --b_age := 10;
  
  v_cursor := dbms_sql.open_cursor;

  v_sql := 'update stuinfo set stuname = :v_stuname , age = :v_age where stuid = :v_stuid';

  BEGIN

    dbms_sql.parse(v_cursor,
                   v_sql,
                   dbms_sql.native);
   
    dbms_sql.bind_variable(v_cursor,':v_stuid',b_stuid);
    dbms_sql.bind_variable(v_cursor,':v_stuname',b_stuname);
    dbms_sql.bind_variable(v_cursor,':v_age',b_age);
   
    row_process := dbms_sql.execute(v_cursor);

    dbms_sql.close_cursor(v_cursor);
    commit;
    return row_process;
  end;
END F_cursor_update;
                    ------动态删除------
CREATE OR REPLACE FUNCTION f_cursor_delete (b_stuid in varchar2)
        RETURN VARCHAR2   AS
                     row_process    varchar2(10);
                     v_cursor       NUMBER;
                     v_sql         varchar2(200);
BEGIN
  
  v_cursor := dbms_sql.open_cursor;

  v_sql := 'delete from stuinfo where stuid = :v_stuid';

  begin

  dbms_sql.parse(v_cursor,
                 v_sql,
                 dbms_sql.native);
 
  dbms_sql.bind_variable(v_cursor,':v_stuid',b_stuid);
  row_process := dbms_sql.execute(v_cursor);

 
  dbms_sql.close_cursor(v_cursor);
 
  return row_process;
  end;
END f_cursor_delete;
--------------游标--------return t_table---------------------
create or replace function f_return_table1 (sqlstr IN VARCHAR2) return t_table
       IS
    --创建一个类型变量cur,它引用游标
    --TYPE cur:定义类型变量
    --is ref cursor:相当于数据类型,不过是引用游标的数据类型。
    TYPE ref_cursor_type IS REF CURSOR; --定义一个动态游标
    users ref_cursor_type;   --定义游标类型
    --user obj_table; --定义变量类型, 这里的users是表明
    vSql VARCHAR2(255); --sql文本
    o_tb t_table := t_table();
    v_id varchar(20);
    v_cd_name varchar(50);
i number := 0;
BEGIN
  vSql := sqlstr; --要查询的sql字符串,可拼接起来
  OPEN users FOR  vSql;  --打开游标
  LOOP
    FETCH users INTO v_id,v_cd_name; --循环遍历users列表给user,user为临时对象
    exit when users%notfound; 

 o_tb.extend;
    i := i + 1;
    o_tb(i) := obj_table (v_cd_name,v_id);
    --dbms_output.put_line(o_tb);
  end loop;

  CLOSE users;
 
  return o_tb;
  end;
--select * from table(c##zhaojian.f_return_table('select stuid,stuname from stuinfo'));  查询结果


-----------------------------------------------------------------------
CREATE OR REPLACE TYPE "T_TABLE"
  is table of obj_table
------------------------------------------------------------------------
create or replace type OBJ_TABLE as object
(
   id VARCHAR2(20),
   name VARCHAR2(1000)
)
------------------------------------------------------------------------
--------------游标-----------管道------------return t_table-----------------
create or replace function f_return_table2_guandao (sqlstr IN VARCHAR2) return t_table
   pipelined  as
    --创建一个类型变量cur,它引用游标
    --TYPE cur:定义类型变量
    --is ref cursor:相当于数据类型,不过是引用游标的数据类型。
    TYPE ref_cursor_type IS REF CURSOR; --定义一个动态游标
    users ref_cursor_type;   --定义游标类型
    --user obj_table; --定义变量类型, 这里的users是表明
    vSql VARCHAR2(255); --sql文本
    --o_tb t_table := t_table();
    v_id varchar(20);
    v_cd_name varchar(50);
    --i number := 0;
BEGIN
  vSql := sqlstr; --要查询的sql字符串,可拼接起来
  OPEN users FOR  vSql;  --打开游标
  LOOP
    FETCH users INTO v_id,v_cd_name; --循环遍历users列表给user,user为临时对象
     
    exit when users%notfound; 
    
    pipe row(obj_table (v_id,v_cd_name));
  end loop;

  CLOSE users;
 
  return;
  end;
--select * from table(c##zhaojian.f_return_table('select stuid,stuname from stuinfo'));  查询结果
-----------------------------------------------------------------------
CREATE OR REPLACE TYPE "T_TABLE"
  is table of obj_table
-----------------------------------------------------------------------
create or replace type OBJ_TABLE as object
(
   id VARCHAR2(20),
   name VARCHAR2(1000)
)
------------------------------------------------------------------------
-----------------------管道-----------------查询数据------------
create or replace function f_return_guandao (pIdIn NVARCHAR2  )
   return T_TABLE pipelined --管道
as
  v OBJ_TABLE;
begin
  for thisrow in (
    SELECT  stuid,stuname FROM stuinfo
    start with stuid=pIdIn connect by stuname=prior stuid)loop
    v:=OBJ_TABLE(thisrow.stuid,thisrow.stuname);
    pipe row(v);
  end loop;
  return;
end;
--select * from table(F_Test(10));    查询结果
 
--------------本地动态sql------------相当于游标进行查询--------
create or replace function F_LOCAL_EXECUTE
  return varchar2 is
  L_VLAUES varchar2(200);
  V_TIME number;
  V_STATEMENT varchar2(200);
begin
      V_TIME := 1;
            V_STATEMENT :=
                  'SELECT MAX(stuid) FROM stuinfo  M WHERE M.sex = :1';

            EXECUTE IMMEDIATE V_STATEMENT
                         INTO L_VLAUES
                        USING V_TIME;
  return L_VLAUES;
end F_LOCAL_EXECUTE;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值