繁体   English   中英

为什么在函数vs匿名块中执行同一查询时会从两个查询中得到两个不同的结果

[英]Why am i getting two different results from same query when executing it in a function vs anonymous block

我有相同的逻辑来检查数据库中是否存在给定的表。 一方面,我将逻辑放在一个函数中,另一方面,我将逻辑放在一个匿名块中。 当我调用该函数时,我得到一个答案,而当我运行匿名博克时,我得到另一个答案。 这是我的功能:

CREATE OR REPLACE FUNCTION table_exists(in_table_name IN varchar2) RETURN int
is
   var_regex varchar2(30) := '(\w*)([^\.])';
   var_exists number(1); 
BEGIN

  SELECT  CASE WHEN EXISTS( SELECT 1 FROM all_tab_cols WHERE TABLE_NAME = UPPER( REGEXP_SUBSTR ( in_table_name, var_regex , 1, 2))) 
  THEN 1 ELSE 0 END INTO var_exists FROM dual;

  DBMS_OUTPUT.PUT_LINE('var_exists is: ' || var_exists);


  IF (var_exists = 1) 
  THEN 
    RETURN var_exists;
  ELSE
    RETURN var_exists;
  END IF; 
END;

这就是我调用此函数的方式:

select table_exists('test_schama.test_table') as table_exits from DUAL; 

该函数返回零,这意味着该表不存在。 这是不正确的,因为'test_schama.test_table'确实存在。

我的匿名阻止如下:

DECLARE 
    in_table_name varchar2(100) := 'test_schama.test_table';
    var_regex varchar2(30) := '(\w*)([^\.])';
    var_exists int;
BEGIN
   SELECT  CASE WHEN EXISTS( SELECT 1 FROM all_tab_cols WHERE TABLE_NAME = UPPER( REGEXP_SUBSTR ( in_table_name, var_regex , 1, 2))) 
   THEN 1 ELSE 0 END INTO var_exists FROM dual;
   DBMS_OUTPUT.PUT_LINE('var_exists is: ' || var_exists);
END;       

Var_exists的值为1,表示该表存在。 没错 我不明白的是为什么我从同一个精确查询中得到两个不同的答案?

您正在查询all_tab_cols 这将显示您有权访问的所有表。 不一定是数据库中的所有表。 在定义者的权限存储函数(例如table_exists )内部,将您限制为已直接(而不是通过角色)授予该函数的所有者访问权限的表。 在匿名块中, all_tab_cols将显示通过当前会话中启用的角色可以访问的任何表的数据。 由于匿名块有效且存储的功能无效,因此我假设该函数的所有者没有直接在表上授予访问权限,但是您当前的会话确实具有启用该访问权限的角色。

您最有可能需要

  • 使用调用者的权限存储功能(在这种情况下, all_tab_cols行将基于当前会话的特权),
  • 请改用dba_tab_cols数据字典表,或者
  • 授予存储函数的所有者至少直接select不通过角色访问表的权限。

暂无
暂无

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

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