Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不了解PLS-00049:坏绑定变量是什么_Sql_Oracle_Stored Procedures - Fatal编程技术网

Sql 不了解PLS-00049:坏绑定变量是什么

Sql 不了解PLS-00049:坏绑定变量是什么,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,在Oracle SQL中创建存储过程时,我得到了一个PLS-00049坏绑定变量。不确定这里出了什么问题: CREATE OR REPLACE PROCEDURE ADD_REGISTRATION( customer_id_arg IN DECIMAL, cus_account_id_arg IN DECIMAL, registration_date_arg IN DATE) IS BEGIN SELECT * FROM R

在Oracle SQL中创建存储过程时,我得到了一个PLS-00049坏绑定变量。不确定这里出了什么问题:

    CREATE OR REPLACE PROCEDURE ADD_REGISTRATION(
    customer_id_arg IN DECIMAL,
    cus_account_id_arg IN DECIMAL,
    registration_date_arg IN DATE)
    IS
    BEGIN
      SELECT *
      FROM REGISTRATION
      WHERE CUSTOMER_ID = :NEW.CUSTOMER_ID;
      IF CUSTOMER_ID = :NEW.CUSTOMER_ID THEN
         INSERT INTO REGISTRATION(customer_id, cus_account_id, 
         registration_date)
         VALUES(customer_id_arg, CUS_ACCOUNT_ID_SEQ.NEXTVAL, CAST(SYSDATE AS 
         DATE));
      ELSE
         RAISE_APPLICATION_ERROR(-20001, 'Customer ID does not exist. Choose an existing Customer ID in order to 
         register an extra account under an existing customer.');
     END IF;
   END;
以下是具体错误: 错误8,25:PLS-00049:绑定变量“NEW.CUSTOMER\u ID”错误 错误9,22:PLS-00049:坏绑定变量“NEW.CUSTOMER_ID”

触发器中只存在:NEW和:OLD伪行。如果您想调用一个使用:NEW或:OLD数据的子程序,您可以这样做,但必须将每个字段作为参数传递给过程或函数。例如:

CREATE OR REPLACE PROCEDURE ADD_REGISTRATION(customer_id_arg IN DECIMAL)
IS
  rowRegistration  REGISTRATION%ROWTYPE;
BEGIN
  -- The following SELECT will raise NO_DATA_FOUND if the passed-in CUSTOMER_ID
  -- doesn't exist, in which case we want to insert the new customer into the database.
  -- If the CUSTOMER_ID arg already exists in REGISTRATION we want to raise an
  -- application error.

  SELECT *
    INTO rowRegistration
    FROM REGISTRATION
    WHERE CUSTOMER_ID = customer_id_arg;

  RAISE_APPLICATION_ERROR(-20001, 'Customer ID does not exist. Choose an existing Customer ID in order to 
     register an extra account under an existing customer.');
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    INSERT INTO REGISTRATION(customer_id, cus_account_id, registration_date)
       VALUES(customer_id_arg, CUS_ACCOUNT_ID_SEQ.NEXTVAL, SYSDATE);
END ADD_REGISTRATION;
然后在触发器中调用上述例程:

CREATE OR REPLACE TRIGGER REGISTRATION_VIEW_II
  INSTEAD OF INSERT ON REGISTRATION_VIEW
  FOR EACH ROW
BEGIN
  REGISTRATION_ADD(:NEW.CUSTOMER_ID);
END REGISTRATION_VIEW_II;
在这里,我假设这个触发器应该是视图上的INSERT触发器,而不是INSERT触发器,因为这是在没有进一步上下文的情况下对我来说唯一有意义的事情,但是您可能还有一些我不知道的其他用例


祝您好运。

您似乎混淆了触发器和存储过程。如果我想用存储过程添加一个新实例,但检查主键值是否存在,该怎么办?这里的情况是,我的客户可以有多个帐户。如果我想以多个帐户的名称注册多个帐户,我想使用存储过程来创建额外的帐户。因此,如果我要添加一个新的客户id,我想确保它已经存在,以便我可以创建一个新帐户。如果不是,则提出错误…:NEW是仅在触发器中有效的构造。我建议你再问一个问题,提供样本数据,期望的结果,并清楚地解释你想要实现的目标。