动态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