【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;
/

posted on 2018-04-05 12:06  绿Z 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/greenZ/p/8721887.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值