鉴于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
,其中包含表格中重复的字段组合:tableA
和tableB
。
注意:表格tableA
和tableB
确实存在 - 如下所示的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(*)
答案 0 :(得分:2)
好的,你已经知道你有私人问题。我想补充一点,你不能根据你的功能创建CHECK约束。根据{{3}}:
因此,为了达到你想要的效果,你必须定义一些触发器,或者使用MATERIALIZED VIEW和CHECK约束的某种组合。例如,请参阅此documentation
答案 1 :(得分:1)
您可能通过角色访问TableA和TableB。这意味着您可以查询表,但无法创建读取或写入该表的过程。为了编译您的程序,您至少应该在桌面上向用户授予选择权。
在下面的链接中,您可以找到更多信息
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1065832643319