PL/SQL编程中的问题
1、存储过程和存储函数中的as和is
Oracle中的as和is是Oracle为了方便而设置的同义词基本上没有不同 。
使用规则:
(1)在创建存储过程(procedure)/函数(function),以及自定义类型(type)和包(package)时,使用as和is无区别。
(2)在创建视图(view)时,只能使用as而不能使用is。
(3)在声明游标(cursor)时,只能使用is而不能使用as。
2、in、out、inout
(1)in:in模式是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。
(2)out:out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递到存储过程的调用处。
(3)inout:inout模式通俗来说就表示既可以向过程体外传递参数也可以从过程体内传出数值。
3、:=和=:和=
(1):=表示是赋值语句
(2)=:是Oracle触发器里的:new和:old行处理时的新值和旧值的行记录
就是固定用法,和=没有关系。
例:(1)UPDATE E1 SET DEPTNO = 'ABC'||:NEW.DEPTNO WHERE DEPTNO =:OLD.DEPTNO;
也可以在触发器中定义一个变量 v_aaa,然后赋值:
v_aaa := :NEW.DEPTNO;
(2)变量绑定:变量绑定是指在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优化比较困难。
(3)=是比较操作符,判断两边参数是否相等,或者在更新语句中进行赋值。
4、过程和函数的使用
核心提示:本质上没区别。只是函数有限制只能返回一个标量,而存储过程可以返回多个。并且函数是可以
嵌入在SQL中使用的,可以在select等SQL语句中调用,而存储过程不行。执行的本质都一样。
5、同义词
synonym:同义词相当于是对象的小名,作用是缩短对象的长度,便于书写与访问。
例:1、假设有表s_student,为表t_student创建同义词std
create synonym std for t_student
2、此时使用同义词std查询表t_student中所有数据
select * from std
3、删除同义词
drop synonym std