Oracle SQl无效对象

Oracle SQl无效对象,oracle,plsql,Oracle,Plsql,我的程序遇到了一些问题,我认为代码在工作,程序运行并要求用户输入,用户输入存储在程序变量中的数据,然后插入到表中。但当我输入所有内容时,我会面临一个错误。是否可以在程序中使用插入,或者我应该走不同的路线?谢谢 我的程序 create or replace PROCEDURE AD_AGENCY_INFO( v_agency_id IN OUT AD_AGENCY.AGENCY_ID%TYPE, v_no_of_ad_runs IN OUT AD_AGENCY.NO_OF_AD_RUNS%TY

我的程序遇到了一些问题,我认为代码在工作,程序运行并要求用户输入,用户输入存储在程序变量中的数据,然后插入到表中。但当我输入所有内容时,我会面临一个错误。是否可以在程序中使用插入,或者我应该走不同的路线?谢谢

我的程序

  create or replace PROCEDURE AD_AGENCY_INFO(
v_agency_id IN OUT AD_AGENCY.AGENCY_ID%TYPE,
v_no_of_ad_runs IN OUT AD_AGENCY.NO_OF_AD_RUNS%TYPE,
v_credit_worthy IN OUT AD_AGENCY.CREDIT_WORTHY%TYPE,
v_available_slots IN OUT AD_AGENCY.AVAILABLE_SLOTS%TYPE,
v_status IN OUT AD_AGENCY.STATUS%TYPE
) AS
  BEGIN

SELECT AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS 
INTO 
v_agency_id, v_no_of_ad_runs, v_credit_worthy, v_available_slots, v_status 
FROM AD_AGENCY;

INSERT INTO AD_AGENCY (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS) 
VALUES (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS);
INSERT INTO AD (AGENCY_ID) VALUES (AGENCY_ID);


END AD_AGENCY_INFO;
DECLARE
 V_AGENCY_ID NUMBER:='&Enter_Agency_ID';
V_NO_OF_AD_RUNS NUMBER:='&Enter_No_of_Ad_Runs';
V_CREDIT_WORTHY CHAR(3):='&Enter_Cedit_Worthy';
  V_AVAILABLE_SLOTS NUMBER:='&Enter_Available_Slots';
V_STATUS CHAR(1):='&Enter_Status';
BEGIN
V_AGENCY_ID := NULL;
V_NO_OF_AD_RUNS := 0;
V_CREDIT_WORTHY := NULL;
V_AVAILABLE_SLOTS := NULL;
V_STATUS := NULL;

AD_AGENCY_INFO(
V_AGENCY_ID => V_AGENCY_ID,
V_NO_OF_AD_RUNS => V_NO_OF_AD_RUNS,
V_CREDIT_WORTHY => V_CREDIT_WORTHY,
V_AVAILABLE_SLOTS => V_AVAILABLE_SLOTS,
V_STATUS => V_STATUS
); 
END;
/
我怎么称呼这个程序

  create or replace PROCEDURE AD_AGENCY_INFO(
v_agency_id IN OUT AD_AGENCY.AGENCY_ID%TYPE,
v_no_of_ad_runs IN OUT AD_AGENCY.NO_OF_AD_RUNS%TYPE,
v_credit_worthy IN OUT AD_AGENCY.CREDIT_WORTHY%TYPE,
v_available_slots IN OUT AD_AGENCY.AVAILABLE_SLOTS%TYPE,
v_status IN OUT AD_AGENCY.STATUS%TYPE
) AS
  BEGIN

SELECT AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS 
INTO 
v_agency_id, v_no_of_ad_runs, v_credit_worthy, v_available_slots, v_status 
FROM AD_AGENCY;

INSERT INTO AD_AGENCY (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS) 
VALUES (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS);
INSERT INTO AD (AGENCY_ID) VALUES (AGENCY_ID);


END AD_AGENCY_INFO;
DECLARE
 V_AGENCY_ID NUMBER:='&Enter_Agency_ID';
V_NO_OF_AD_RUNS NUMBER:='&Enter_No_of_Ad_Runs';
V_CREDIT_WORTHY CHAR(3):='&Enter_Cedit_Worthy';
  V_AVAILABLE_SLOTS NUMBER:='&Enter_Available_Slots';
V_STATUS CHAR(1):='&Enter_Status';
BEGIN
V_AGENCY_ID := NULL;
V_NO_OF_AD_RUNS := 0;
V_CREDIT_WORTHY := NULL;
V_AVAILABLE_SLOTS := NULL;
V_STATUS := NULL;

AD_AGENCY_INFO(
V_AGENCY_ID => V_AGENCY_ID,
V_NO_OF_AD_RUNS => V_NO_OF_AD_RUNS,
V_CREDIT_WORTHY => V_CREDIT_WORTHY,
V_AVAILABLE_SLOTS => V_AVAILABLE_SLOTS,
V_STATUS => V_STATUS
); 
END;
/
错误报告

Error report -
ORA-06550: line 14, column 3:
PLS-00905: object DT2113A.AD_AGENCY_INFO is invalid
ORA-06550: line 14, column 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

这里可能有一些打字错误:

INSERT INTO AD_AGENCY (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS) 
VALUES (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS);
--      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
价值观是。。。好的,值,而不是列名。也许你在想:

INSERT INTO AD_AGENCY (AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS) 
VALUES (v_agency_id, v_no_of_ad_runs, v_credit_worthy, v_available, v_status);
顺便说一句,代码的其余部分可能还需要一些思考; 例如,当您的表中有多行时,该代码将不起作用:

SELECT AGENCY_ID, NO_OF_AD_RUNS, CREDIT_WORTHY, AVAILABLE_SLOTS, STATUS 
INTO 
v_agency_id, v_no_of_ad_runs, v_credit_worthy, v_available_slots, v_status 
FROM AD_AGENCY;

也许WHERE子句不见了?即使如此,它也会覆盖IN参数值。在这一点上,可能不是您想要的东西…

我对plsql不太熟悉,但似乎您在第二个块中错误地调用了该过程。试着写:

CALL AD_AGENCY_INFO( 
... 
);
或者使用Exec,我不太确定:

EXEC AD_AGENCY_INFO(
 ...
);

表示该过程未成功编译。因此Oracle将其标记为无效。删除了SQL SERVER标记错误消息表明程序ad_agency_信息有问题。您是否能够在没有错误或警告的情况下编译广告机构信息?从状态为“有效”的用户对象中选择*;嗨,suzy是的,我可以从表格中定期选择谢谢你的回复,但这对我来说没有意义,我还是个新手this@Hayes121我编辑了我的答案,向你展示了一个可能?可能至少更正确的INSERT语句。如果您对PL/SQL非常陌生,那么一定要花一些时间阅读更多的教程!PL/SQL一开始可能是一个困难的野兽!祝你好运