Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从select语句调用时返回空字符串的函数_Sql_Oracle_Stored Procedures_Plsql_Oracle10g - Fatal编程技术网

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

Sql 从select语句调用时返回空字符串的函数,sql,oracle,stored-procedures,plsql,oracle10g,Sql,Oracle,Stored Procedures,Plsql,Oracle10g,从select语句调用时 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 =

从select语句调用时

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

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

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

第二,异常处理程序的用途是什么?捕捉无法处理的异常并调用dbms_输出是没有意义的,因为客户机可能启用或可能未启用该异常,并且可能从缓冲区读取dbms_输出,也可能不写入。删除异常处理程序并查看是否引发错误

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

select abc('pqr') FROM DUAL ;

abc('PQR')                                                         
1 row selected.

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

当您自己从光标运行SELECT时,它是否返回行?@Hallainzil:是的,它返回40条记录,但声誉不佳?我看不出您的代码有任何问题,它在我的例子中起作用。这不是像区分大小写之类的傻事,是吗?等等。。。abc'PQR'是语句实际返回的内容吗?+1只需补充一点,PL\SQL中出现`-`分隔列列表的原因我完全不知道。
SQL> set role none