2020-09-16

动态sql

 

 --拼接动态sql
    sqltxt := 'update ' || tablename1 || '  t
             set t.partid=(select t3.f_id from i_partlist t3 where t3.part_no=t.part_no
             and nvl(t3.part_techstate,'' '')=nvl(t.part_techstate,'' ''))
             where not  exists(select t2.f_id from i_Partlist t2 where t2.f_id=t.partid)';
    --执行动态sql
    execute immediate sqlTxt;

 

给变量赋值

(1)用select XX into xx给变量赋值

 select count(1)  into v_count  from A t where t.A='aaa';

(2)直接赋值

V_TEST := 123;

 

 

给变量赋值

(1)用select XX into xx给变量赋值

 select count(1)  into v_count  from A t where t.A='aaa';

(2)直接赋值

V_TEST := 123;

 

":="是赋值语句 如: l_name :='sky';...
"=" 是判断是否相等. 如: if 1=1 then...
":" 是变量绑定 如: if :P_NAME ='sky' then...

 

存储过程:

参数的几种类型:
       in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。
       out 模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
       in out 表示高参数可以向该过程中传递值,也可以将某个值传出去

1.3.1,不带参数的存储过程:

CREATE OR REPLACE PROCEDURE MYDEMO02
AS
        name VARCHAR(10);
        age NUMBER(10);
BEGIN
        name := 'xiaoming';--:=则是对属性进行赋值
        age := 18;
        dbms_output.put_line ( 'name=' || name || ', age=' || age );--这条是输出语句
END;
--存储过程调用(下面只是调用存储过程语法)
BEGIN
    MYDEMO02();
END;

 1.3.2,带参数的存储过程:

CREATE OR REPLACE procedure MYDEMO03(name in varchar,age in int)
AS
BEGIN
      dbms_output.put_line('name='||name||', age='||age);
END;

--存储过程调用
BEGIN
    MYDEMO03('姜煜',18);
END;

1.3.3,出现异常的输出存储过程:

CREATE OR REPLACE PROCEDURE MYDEMO04
AS
    age INT;
BEGIN
    age:=10/0;
    dbms_output.put_line(age);
EXCEPTION when others then   --处理异常
    dbms_output.put_line('error');
END;
--调用存储过程
BEGIN
     MYDEMO04;
END;

游标的使用

CREATE OR REPLACE PROCEDURE job_day07
IS
BEGIN
DECLARE
    cursor emp_sor is select name,sal FROM EMPS WHERE EMPNO = '1001'; --声明游标
    cname EMPS.NAME%type; --%type 作用: 声明的变量ename与EMPS表的NAME列类型一样
    csal EMPS.SAL%type;
BEGIN
    open emp_sor; --打开游标
    loop
--     取游标值给变量
    FETCH emp_sor into cname,csal;
    dbms_output.put_line('name:'||cname);
    exit when emp_sor%notfound;
    end loop;
    close emp_sor; --关闭游标
end;
end;
--调用存储过程
BEGIN
    job_day07();
END;

 

@与@@的区别
    @ 用来运行一个SQL脚本文件,等于Start命令。@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件
    @@用在SQL脚本文件中,用来指定用@@执行的文件与@@所在的当前SQL文件在同一目录,而不用指定全路径

&与&&的区别
    & 用来创建一个临时变量,每当遇到这个临时变量时,都会提示你输入一个值
    &&用来创建一个持久变量,当用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只是在第一次遇到时提示一次

 

变量绑定 是指在sql语句的条件中使用变量而不是常量。比如shared pool里有两条sql语句,
select * from tab1 where col1=1;
select * from tab1 where col1=2;
对oracle数据库来说,这是两条完全不同的SQL,对这两条语句都需要进行hard parse。因为oracle会根据sql语句的文本去计算每个字符在内存里的hash值,因此虽然上述两条SQL只有一个字符不一样,oracle根据hash算法在内存中得到的hash地址就不一样,所以oracle就会认为这是两条完全不同的语句。而如果将上述SQL改写成
        select * from tab1 where col1=:var1;

   通过对变量var1的赋值去查询,那么oracle对这条语句第一次会进行hard parse,以后就只进行soft parse。假设某条语句被重复执行了几十万次,那么使用bind var带来的好处是巨大的。一个应用程序如果bind var使用不充分,那么几乎一定会伴随着严重的性能问题。

绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难

 

oracle通配符和运算符

用于where比较条件的有:   

   等于:=、<、<=、>、>=、<>   

  包含:in、not in exists、not exists   

   范围:between...and、not between....and   

    匹配测试:like、not like   

     Null测试:is null、is not null 

 布尔链接:and、or、not 

 

 

      双竖线(||):Oracle使用双竖线表示字符串连接函数。 

  星号(*):select *意味着选择所有的列,count(*)意味着计算所有的行,表示通配符时,表示0个或任意多个字符。    

     正斜   杠(/):在Oracle中,用来终止SQL语句。更准确的说,是表示了“运行现在位于缓冲区的SQL代码”。正斜杠也用作分隔项。  

 不等于:有多种表达方式:!=、^=、<>、not xxx=yyy、not(xxx=yyy)

 

 

参考

https://blog.csdn.net/weixin_41968788/article/details/83659164

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值