【oracle】procedure, function,绑定变量

1124-01 procedure, function,绑定变量

补充:子程序中的 查询语句,dml,ddl,tcl语句
1.查询语句
1)静态语句:select into from;

2)动态语句:execute immediate <vv_sql> into <vv_result>;

2.DML,TCL

1)静态SQL
2)动态SQL:execute immediate <vv_sql>;
3. DDL
1) 动态SQL
注意:如果 数据库对象的名称,字段名称 是用字符串变量或字符串拼接 得到的,那么只能用 动态SQL,否则不会被解析为 数据库对象,而作为普通字符串。
——procedure
语法:
create or replace procedure <procedure> (
参数1 in 数据类型,
参数2 out 数据类型,

)
is
变量|数据类型的定义
begin
<body>
exception
<exception_handler>
end <procedure>;
/

说明:参数的数据类型, 不可指定数据类型的长度。

调用方式:
1. 普通变量
<procedure>(<参数列表>);
2.绑定变量
execute <procedure>(<参数列表>);
或者
call <procedure>(<参数列表>);

【例子】
set serveroutput on;
/*定义存储过程*/
create or replace procedure prc_getCnt(
ii_serial_no in integer,
oi_result out integer
)
is
begin
select count(*) into oi_result from t_sales where serial_no >= ii_serial_no;
exception
when others then
oi_result := sqlcode;
end prc_getCnt;
/

/*调用*/
set serveroutput on;
--参数为 1.普通变量
declare
vi_serial_no integer;
vi_result integer;
begin
vi_serial_no := 2;
prc_getCnt( vi_serial_no, vi_result );
dbms_output.put_line(vi_result);
end;
/


set serveroutput on;
--参数为 2.绑定变量
variable vi_serial_no number; --定义
variable vi_result number;
execute :vi_serial_no := 2; --赋值
print vi_serial_no;
print vi_result;
execute prc_getCnt(:vi_serial_no,:vi_result); --引用
--call prc_getCnt(:vi_serial_no,:vi_result); --此处call 等同于 execute
print vi_result;


说明:oracle的普通变量,参数最终都被解析为绑定变量的。
动态绑定变量的使用场景:
1. 调用procedure,function
2. ref cursor游标的定义

绑定变量 参考:
使用绑定变量的一点总结!
http://wenku.baidu.com/view/9cd65005284ac850ad0242b0.html?from=search

Oracle数据库的绑定变量特性及应用 http://wenku.baidu.com/view/92be30c24028915f804dc280.html?from=search


——function
语法:
create or replace function <function> (
参数1 in 数据类型,
参数2 out 数据类型,

)
return 数据类型
is
变量|数据类型的定义
begin
<body>
exception
<exception_handler>
end <procedure>;
/

说明:参数|return的数据类型, 不可指定数据类型的长度。


1. ORA-14552:cannot perform a DDL,commit or rollback inside a query or DML.
即当function中执行DDL,commit,rollback语句时,不可以用a query ,DML 调用该function。

/*举例:删除指定数据库对象*/
create or replace function fnc_drop_object(
iv_obj_name in varchar2(30)
)
return integer
is
oi_result integer;
vv_obj_type varchar2(30);
vv_sql varchar2(500);
begin
/**@description 删除类型为 TABLE,SEQUENCE,VIEW,SYNONYM 的数据库对象*/
select object_type into vv_obj_type from user_objects where object_name = upper('iv_obj_name');
if (vv_obj_type is not null) and (instr('TABLE$SEQUENCE$VIEW$SYNONYM',vv_obj_type) > 0) then
vv_drop_sql := 'drop '||vv_obj_type||' '||iv_obj_name;
execute immediate vv_sql;
oi_result := 0;
end if;
return oi_result;
exception
when others then
oi_result := sqlcode;
return oi_result;
end;
/

调用方式1.a query :报错 ORA-14552
set serveroutput on;
select fnc_drop_object('seq_test01') from dual;

调用方式2.定义变量接收return:正确
set serveroutput on;
declare
vi_result integer;
begin
vi_result := fnc_drop_object('seq_test01');
dbms_output.put_line(vi_result);
end;
/

调用方式2.定义绑定变量接收return:正确
set serveroutput on;
var vi_result number; --没有integer 类型
-- variable vi_result number;
print vi_result; --默认值为null
exec :vi_result := fnc_drop_object('seq_test01');
-- execute :vi_result := fnc_drop_object('seq_test01');
print vi_result;


调用方式3.dbms_output打印:正确
set serveroutput on;
begin
dbms_output.put_line(to_char( fnc_drop_object('seq_test01')));
end;
/

调用方式4.:同3,正确
set serveroutput on;
execute dbms_output.put_line(to_char( fnc_drop_object('seq_test01'))); --execute 相当于 在plsql 块前后分别 加上 begin 和 end;

/*例子:周函数*/
create or replace function fnc_get_weekend(statis_date in number(8))
return integer;
is
oi_result integer;
begin
select to_number(to_char(next_day(to_date(to_char(statis_date),'yyyymmdd'),'sunday') -7 ,'yyyymmdd'))
into oi_result from dual;
return oi_result;
exception
when others then
oi_result := sqlcode;
return oi_result;
end;
/

原文地址:https://www.cnblogs.com/greenZ/p/8721887.html