PLS-00357:此上下文中不允许表、视图或序列引用

Posted

技术标签:

【中文标题】PLS-00357:此上下文中不允许表、视图或序列引用【英文标题】:PLS-00357: Table,View Or Sequence reference not allowed in this context 【发布时间】:2015-10-09 16:43:37 【问题描述】:

我想在我的包体中编写一个更新程序。在我添加这个 IF 语句之前它工作正常。我想检查只有当新值与旧值不同时,我才更新它。否则,我不会更新它。然后我得到了这个错误:Error(39,22): PLS-00357: Table,View Or Sequence reference 'USER.TABLE_NAME.FIRSTNAME' not allowed in this context。以下是我的程序代码:

PROCEDURE updateTABLE (
  v_code        IN      USER.TABLE_NAME.CODE%TYPE,
  v_id          IN      USER.TABLE_NAME.ID%TYPE,
  v_firstname   IN      USER.TABLE_NAME.FIRSTNAME%TYPE,
  v_lastname    IN      USER.TABLE_NAME.LASTNAME%TYPE,
  v_email       IN      USER.TABLE_NAME.EMAIL%TYPE,
  v_phone       IN      USER.TABLE_NAME.PHONE%TYPE
) IS
BEGIN
IF USER.TABLE_NAME.FIRSTNAME != v_firstname OR
   USER.TABLE_NAME.LASTNAME != v_lastname OR
   USER.TABLE_NAME.EMAIL != v_email OR
   USER.TABLE_NAME.PHONE != v_phone THEN
UPDATE USER.TABLE_NAME
        SET FIRSTNAME = v_firstname,
            LASTNAME = v_lastname,
            EMAIL = v_email,
            PHONE = v_phone,
            SYS_LASTMODF_DTTM = sysdate
  WHERE USER.TABLE_NAME.ID = v_id AND
        USER.TABLE_NAME.CODE= v_code;

END IF;
COMMIT;
END updateTABLE;

想知道我应该如何解决它?在这里做了一些搜索,但没有找到我需要的。

【问题讨论】:

您可以检查UPDATE语句的WHERE子句中的值。 BEGIN UPDATE USER.TABLE_NAME SET FIRSTNAME = v_firstname, LASTNAME = v_lastname, EMAIL = v_email, PHONE = v_phone, SYS_LASTMODF_DTTM = sysdate WHERE USER.TABLE_NAME.ID = v_id AND USER.TABLE_NAME.CODE= v_code AND (USER.TABLE_NAME.FIRSTNAME != v_firstname OR USER.TABLE_NAME.LASTNAME != v_lastname OR USER.TABLE_NAME.EMAIL != v_email OR USER.TABLE_NAME.PHONE != v_phone); COMMIT; 完美运行~非常感谢! 如果您想了解更多,请搜索游标。你会发现你的初始来源没有意义。 而且,这段代码在触发器上更有意义。 【参考方案1】:

答案在评论里,我只是想把它放在这里,以防以后有人需要。

BEGIN 
  UPDATE USER.TABLE_NAME 
    SET FIRSTNAME = v_firstname, 
        LASTNAME = v_lastname, 
        EMAIL = v_email, 
        PHONE = v_phone, 
        SYS_LASTMODF_DTTM = sysdate 
    WHERE USER.TABLE_NAME.ID = v_id 
      AND USER.TABLE_NAME.CODE= v_code 
      AND (USER.TABLE_NAME.FIRSTNAME != v_firstname 
        OR USER.TABLE_NAME.LASTNAME != v_lastname 
        OR USER.TABLE_NAME.EMAIL != v_email 
        OR USER.TABLE_NAME.PHONE != v_phone); 
COMMIT;

【讨论】:

以上是关于PLS-00357:此上下文中不允许表、视图或序列引用的主要内容,如果未能解决你的问题,请参考以下文章

此上下文中不允许使用 YAML 映射值

检查是不是存在 PLS-00405:在此上下文中不允许子查询

在此上下文中不允许 Gitlab CI YML 映射值

在此上下文中不允许使用自动填充字段名称“邮政编码”

sql server 用INSERT语句添加数据时 语句中若有中文或英文字母 执行时就报错 是怎么回事?

错误: 此上下文中不允许函数定义。