PLS-00231_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2606 | 回复: 0   主题: PLS-00231        下一篇 
    本主题由 koei123 于 2015-6-1 14:57:11 移动
John
注册用户
等级:大元帅
经验:90444
发帖:136
精华:2
注册:2011-7-21
状态:离线
发送短消息息给John 加好友    发送短消息息给John 发消息
发表于: IP:您无权察看 2015-3-31 11:39:46 | [全部帖] [楼主帖] 楼主

create or replace function Two
return Number
is
begin
return 2;
end Two;
create or replace  procedure PrintTwo
is
myNum Number;
begin
select Two()
into myNum
from dual;
dbms_output.put_line(myNum);
end PrintTwo;


以上函数和过程,放在函数和过程中声明,调用正常。注意two函数被printtwo过程以sql语句形式调用。

若将此二程序段放入一个package中,函数私有方式,则包体编译时出错,报pls-00231错误,函数不能在sql语句中使用之类。

原因为何?

pl sql和sql对于 oracel而言,是两个不同的引擎,因而对于sql引擎而言,plsql包中私有的two函数,是无法发现的。

所以包中使用two函数,方法有两种:

1 在包头声明中声明two函数,即将two函数作公有声明,此时可以select two into mynum from dual;形式调用,当然这样将无法隐藏two函数。

2 以mynum:=two;方式调用,由于此种方式以pl sql引擎解析,所以可以正常使用以私有方式声明的two函数。

可见需以合适的方式将two函数暴露给sql或plsql引擎方可使用。

--转自 北京联动北方科技有限公司

该贴由koei123转至本版2015-6-1 14:57:10



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论