PL / SQL使用param创建函数以检查约束

时间:2016-08-01 19:49:14

标签: oracle plsql

鉴于syntax

CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName 
     [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])]
     RETURN DataType [InvokerRightsClause] [DETERMINISTIC]
     {IS|AS} 

我认为我的查询在语法上是正确的,但由于某种原因,我在编译时遇到了这些错误:

  

错误(6,5):PL / SQL:忽略SQL语句

     

错误(8,34):PL / SQL:ORA-00942:表或视图不存在

CREATE or replace FUNCTION aCombinationMismatches(p_column1 IN VARCHAR2)
  RETURN Number
IS
duplicate_count NUMBER(4,0);
BEGIN
    select count(*) into duplicate_count
    from schema1.tableA a
    inner join schema1.tableB b
    on a.b_id = b.id and a.column1 = p_column1
    group by a.b_id, a.column1, a.column2, b.column1, b.column2, b.column3;
    return duplicate_count;
END;

任何人都认为我上面的查询有问题吗?

此外,我想如何将此UDF设置为用于创建CHECK约束。我如何指定param:p_param1到函数,假设这是用户尝试插入的行中的字段column1的值?我只是不希望用户将记录插入tableA,其中包含表格中重复的字段组合:tableAtableB

注意:表格tableAtableB确实存在 - 如下所示的select查询表示它。所以上面的错误让我很困惑,我必须补充一下。 (发现/替换了两个查询中的所有表名和列名称都是虚拟值。

select count(*)
from schema1.tableA a
inner join schema1.tableB b
on a.b_id = b.id
group by a.b_id, a.column1, a.column2, b.column1, b.column2, b.column3;

输出:

  

COUNT(*)

2 个答案:

答案 0 :(得分:2)

好的,你已经知道你有私人问题。我想补充一点,你不能根据你的功能创建CHECK约束。根据{{​​3}}:

  • 检查约束的条件可以引用表中的任何列,但它不能引用其他表的列。
  • 检查约束条件不能包含以下结构:
    • 子查询和标量子查询表达式
    • 调用非确定性函数(CURRENT_DATE,CURRENT_TIMESTAMP,DBTIMEZONE,LOCALTIMESTAMP,SESSIONTIMEZONE,SYSDATE,SYSTIMESTAMP,UID,USER和USERENV)
    • 调用用户定义的函数

因此,为了达到你想要的效果,你必须定义一些触发器,或者使用MATERIALIZED VIEW和CHECK约束的某种组合。例如,请参阅此documentation

答案 1 :(得分:1)

您可能通过角色访问TableA和TableB。这意味着您可以查询表,但无法创建读取或写入该表的过程。为了编译您的程序,您至少应该在桌面上向用户授予选择权。

在下面的链接中,您可以找到更多信息

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1065832643319