繁体   English   中英

函数从select语句调用时返回空字符串

[英]function returning empty string when calling from select statement

CREATE OR REPLACE FUNCTION abc (
p_table_name       IN   VARCHAR2
)
RETURN VARCHAR2
IS
v_var varchar(200);
v_data   VARCHAR2 (4000);

CURSOR cur_column_list
IS
   SELECT column_name AS col_name
    FROM all_tab_cols
   WHERE table_name = p_table_name;
BEGIN
open cur_column_list;
 loop
fetch cur_column_list into v_var;
exit when cur_column_list%notfound;

  v_data := v_data || ' -- ' || v_var;

END LOOP;

RETURN v_data;
EXCEPTION
 WHEN OTHERS
 THEN
 dbms_output.put_line(sqlerrm);
END;
/

从select语句调用时

select abc('pqr') FROM DUAL ;

abc('PQR')                                                         
1 row selected.

没有检索到输出,pqr中有40列。

首先,你究竟传递给函数的是什么? 您的SELECT语句显示您传递的是小写字符串'pqr'。 但是以粗体显示,您传递的是大写字符串'PQR'。 由于表名以大写形式存储在大写的数据字典中(除非您碰巧使用了带引号的标识符并指定了小写表名),并且因为您没有在查询中执行UPPER ,这是一个重要的区别。

其次,异常处理程序的目的是什么? 这是没有意义的赶上,你不能处理并调用异常dbms_output ,客户端可能会或可能不会发生已经启用,并可能会或可能不会从缓冲区中读取dbms_output写入。 删除异常处理程序并查看是否抛出错误。

第三,在定义者权限存储过程中运行的代码,即无法访问通过角色授予的权限。 它只能访问直接授予过程所有者的权限。 如果已通过角色授予过程的所有者对相关表的访问权限,则可以直接在SQL * Plus会话中查询ALL_TAB_COLS并查看表,但如果查询位于定义者的权限存储过程中,则不能查看。 在SQL * Plus中,您可以禁用角色以模拟在定义者权限存储过程中可以访问的权限

SQL> set role none

然后重试该操作。 如果您无法再在ALL_TAB_COLS看到预期的数据,则需要授予过程所有者直接访问表的权限,而不是通过角色。 或者,您可以通过SELECT ANY DICTIONARY权限授予用户访问DBA_TAB_COLS视图的权限,并将代码更改为使用DBA_TAB_COLS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM