Oracle 动态sql

 (1).静态的sql语句是的指嵌入在pl/sql语句块中的直接执行语句,而动态的sql语句是指根据业务特定操作而动态输入的

      sql语句块,一般静态态句块要优于动态语句块如果知道业务逻辑最好不要用动态sql

  (2).动态语句可放在pl/sql语句块中,也可以放在过程,包都语句中动态语句一般分为三种处理方法

     .利用execute immediate ,他可以处理多数的动态sql,包括DDLDCLDML,但他吸能处理单行的select语句

        --eg

        declare

        va  varchar2(100);

        begin

        va:='update emp set sal=sal*1.1';--定义了一个动态的sql语句,并让他等于变量va

        execute immediate va;--指行该动态sql语句va

        end;

       在使用execute immediate 时,有时候我们需要通过占位符来占位,然后再通过using语句来动态的给其传参数

       需要说明的是占位符只是用来起个占位的作用,这和他的名字没任何关系,只与定位的顺序有关

       declare

       va varchar2(200);

       begin

       va:='update emp set sal=sal+:dd';--:dd只是用来占位没别的作用

       execute immediate va  using &yy;--通过using 语句来传入数值,与他的名定没任何关系

       end;

      

       同时在使用execute immediate时,有时动态语句中有returning语句,这时我们就需要定义一个变量,

       然后在execute immediate后面利用returning into语句将值传递给这个这变量

       --eg

       declare

       va varchar2(200);--定义一个变量接收sql动态语句

       va1 number(20);--定义一个变量接收return的值

       begin

       va:='update emp set sal=:aa where ename=:bb '||'returning sal into :ss';--:aa,:bb,:ss均为占位符,没任何意义

       execute immediate va using &aa,'&bb' returning into va1;

       dbms_output.put_line(va1);

       end;

      

       execute immediate 在处理查询语句时必须要用into语句 接收返回的数据(execute immediate只能处单行的查询)

       --eg

       declare

       va1 emp%rowtype; --定义一个记录来接收select查询返回的数据

       va varchar2(200);--定义一个接收sql动态语句

       begin

       va:='select * from emp where empno=:empno';

       execute immediate va into va1 using &empno;

       dbms_output.put_line(va1.ename||'  '||va1.sal||'  '||va1.mgr);

       end;

    .利用游标来处理多行查询 语句:open  for fetch  close

      --eg   

      declare

        type reftype is ref cursor;----定义一个游标变量

        my                   reftype;

        emp_result           emp%rowtype;

        sql_a                varchar2(100);

        begin

        sql_a := 'select * from emp where deptno=:dno';

        open                 my for sql_a using &1;

        loop                 fetch my into emp_result;

        exit                 when my%notfound;

        dbms_output.put_line(emp_result.ename || '  ' || emp_result.sal);

      end loop;

      end;

    --同理在动态sql的查询中一样可以使用bluk collect into 语句来进行批处理.

   (3).使用对像类型

    对像同样分为属性与方法

    方法分为:构造方法,map方法,membr方法,static方法

    Member方法:用于访问对象实例的数据

    Static方法:用于访问对象类型

    Map方法:对于标量变量来说,其数据可以直接进行比较,但是对象类型的数据不能直接比较

    order方法  map可以比较两个或都 两个以上的,但是order就只

    能比较两个

   

    建立一个对像

    create or replace type person as object --定义一个对像

    (  name varchar2(20),

       age  number(3),

       member function change_name(va varchar2)return varchar2,--定义一个 member函数

       map member function getname return varchar2--定义一个map函数

    );

   方法定义之后必须给以实现

   --申明了对像方法之后必须在对像体中给出方法的实现

  


create or replace type body person as--定义一个对像体

     member function change_name(va varchar2(20))

      is

       begin

       name:=va;

       return name;

       end;

     member function getname return varchar2

     is

     vn varchar2(20);

     begin

     return name;

     end;

   end;

 

  create table persons( pp person)

  select * from persons

 

  declare

  begin

  insert into persons values(person('张三',25));

  insert into persons values(person('李林',8));

  end;

 

  select * from emp

 

  create or replace function my_function(va1 varchar2,va2 varchar2,va3 varchar2) return varchar2

  is

  vt varchar2(100);

  type myy is table of varchar2(20);

  va myy;

  vc varchar2(100):='';

  begin

  vt:='select'||va1||'bulk collect into va'||'from'||va2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值