【问题标题】:oracle cursor in stored function, subselect with parameter存储函数中的oracle光标,带参数的子选择
【发布时间】:2017-11-23 01:28:06
【问题描述】:

在存储函数中,我需要使用一些子选择进行“动态”查询:

CURSOR c_dyn
AS
    SELECT 'CREATE SYNONYM '
        || username_parameter_from_function
        ||'.'
        ||o.object_name
        || ' FOR '
        || o.OWNER
        ||'.'
        || o.object_name
        ||';' AS OUT_SQL
    FROM SYS.DBA_OBJECTS o
    WHERE o.object_type IN ( 'TABLE', 'VIEW', 'SEQUENCE')
    AND o.OWNER         IN
        (
            SELECT DISTINCT x.OWNER
            FROM SYS.dba_tab_privs x
            WHERE x.GRANTEE IN
                (
                    SELECT DISTINCT p.granted_role
                    FROM SYS.dba_role_privs p
                    WHERE p.GRANTEE=username_parameter_from_function
                )
        AND NOT OWNER LIKE 'SYS%'
        );

这里我们有一些“子”选择和一个来自函数的参数。这不适用于函数。任何想法如何“重新建模”这个?或者mabye更改功能以获得相同的结果?或者有没有办法让它按原样工作......?

谢谢! M

【问题讨论】:

  • 当您尝试通过函数使用它时遇到什么错误?
  • 发布您的完整功能和错误。您应该打开光标进行选择查询。
  • 我得到一个“表或视图不存在”。我解决了它直接在 DBA_TAB_PRIVS 和 DBA_ROLE_PRIVS 和 DBA_OBJECTS 上为用户设置选择授权(即使用户具有 DBA 和其他角色)...

标签: oracle plsql oracle11g oracle12c


【解决方案1】:

让我建议使用cursors with parameters 一个例子:

CURSOR c_dyn(username_param varchar2)
AS
    SELECT 'CREATE SYNONYM '
        || username_param
        || '.'
        || o.object_name
        || ' FOR '
        || o.OWNER
        ||'.'
        || o.object_name
        ||';' AS OUT_SQL
    FROM SYS.DBA_OBJECTS o
    WHERE o.object_type IN ( 'TABLE', 'VIEW', 'SEQUENCE')
    AND o.OWNER         IN
        (
            SELECT DISTINCT x.OWNER
            FROM SYS.dba_tab_privs x
            WHERE x.GRANTEE IN
                (
                    SELECT DISTINCT p.granted_role
                    FROM SYS.dba_role_privs p
                    WHERE p.GRANTEE = username_param
                )
        AND NOT OWNER LIKE 'SYS%'
        );

【讨论】:

  • 特别感谢!那是最好的部分... :-) 必须为视图设置带有授权选项的授权...可能是因为子选择的事实是,它被“包装”在保存在模式中的存储函数中不是 SYS.... 但谢谢!
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多