ORA-01007: variable nicht in select-Liste
Ich versuche das einfügen mehrerer Werte in einer bestimmten Tabelle mit return select-Abfrage, die ich bin nicht in der Lage das einfügen in die Tabelle.Falls ich falsch mache irgendwo lassen Sie es mich bitte wissen.Vielen Dank im Voraus.
create or replace PROCEDURE DE_DUP_PROC1 (Dy_File_Name IN VARCHAR2,
SUPPLIER_CD IN VARCHAR2,
EXT_PHARMA_ID IN VARCHAR2,
FLAG_VALUE IN VARCHAR2,
ERR_COUNT IN VARCHAR2,
OUTPUT_STATUS OUT NUMBER)
AS
c2 SYS_REFCURSOR;
De_Dub_rec1 VARCHAR2 (2000);
v_sql VARCHAR2 (2000);
v_sql1 VARCHAR2 (2000);
ORGNIZATION_ID NUMBER(20);
PHARMACY_ID NUMBER(38);
v_dup_count VARCHAR2 (2000);
SRC_ID NUMBER(38);
DE_DUP_COUNT NUMBER(38);
DE_REC_COUNT1 NUMBER(10) := 3;
TYPE rec_typ IS RECORD
(
OLD_TRANS_GUID VARCHAR2 (255),
R_DSPNSD_DT DATE,
DETL_CLMNS_HASH1 VARCHAR2(255),
KEY_CLMNS_HASH1 VARCHAR2(255),
SUPPLIER_PHARMACY_CD1 VARCHAR2(200)
);
De_Dub_rec rec_typ;
BEGIN
IF DE_REC_COUNT1 > 0
THEN
OUTPUT_STATUS := 0;
dbms_output.put_line(OUTPUT_STATUS);
ELSE
SRC_ID := SRC_FILE_ID_SEQ.nextval
OPEN c2 FOR
( ' SELECT S.TRANS_GUID AS OLD_TRANS_GUID,S.DETL_CLMNS_HASH AS DETL_CLMNS_HASH1 ,S.KEY_CLMNS_HASH AS KEY_CLMNS_HASH1,S.RX_DSPNSD_DT AS R_DSPNSD_DT,
S.SUPPLIER_PHARMACY_CD AS SUPPLIER_PHARMACY_CD1 FROM (SELECT stg.*, row_number() over (partition BY key_clmns_hash ORDER BY 1) AS RN FROM
' || Dy_File_Name || ' stg ) s JOIN ps_pharmacy p ON s.extrnl_pharmacy_id = p.extrnl_pharmacy_id LEFT JOIN ps_rx_hist H
ON h.key_clmns_hash = s.key_clmnS_hash
AND h.rx_dspnsd_dt = s.rx_dspnsd_dt
AND s.supplier_pharmacy_cd = h.SUPPLIER_PHARMACY_CD
WHERE S.RN > 1
OR s.detl_clmns_hash = h.detl_clmns_hash ' );
LOOP
FETCH c2 INTO De_Dub_rec;
EXIT WHEN c2%NOTFOUND;
insert into PS_RX_DUPES(TRANS_GUID,DETL_CLMNS_HASH,KEY_CLMNS_HASH,RX_DSPNSD_DT,SUPPLIER_PHARMACY_CD,SRC_FILE_ID)
values(De_Dub_rec.OLD_TRANS_GUID,De_Dub_rec.DETL_CLMNS_HASH1,De_Dub_rec.KEY_CLMNS_HASH1,De_Dub_rec.R_DSPNSD_DT,De_Dub_rec.SUPPLIER_PHARMACY_CD1,SRC_ID);
commit;
END LOOP;
OUTPUT_STATUS := 1;
dbms_output.put_line(OUTPUT_STATUS);
END IF;
END DE_DUP_PROC1;
Immer wenn ich die Ausführung oben gespeicherte Prozedur, die ich unter Fehler
declare
OUTPUT_STATUS number(2);
begin
DE_DUP_PROC1('T_MCL_10622_20150317_01526556','MCL','10622','BD','3',OUTPUT_STATUS);
end;
Error at line 1
- ORA-01007: variable not in select list
ORA-06512: at "PS_ADMIN.DE_DUP_PROC1", line 53
ORA-06512: at line 6
Der select-Spalten nicht übereinstimmen, dass der record-Typ, den Sie versuchen, zu wählen.
Definitiv nicht verpflichten, innerhalb einer cursor-Schleife. Es ist sehr schlechte Praxis, dies zu tun.
Definitiv nicht verpflichten, innerhalb einer cursor-Schleife. Es ist sehr schlechte Praxis, dies zu tun.
InformationsquelleAutor | 2015-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oracle schleudert
ORA-01007
wenn die Spalten von der Abfrage nicht mit der target-variable.Zeile 53 ist diese Zeile
FETCH c2 INTO De_Dub_rec;
, so der Hinweis ist die Projektion der cursor nicht mit der record-Typ.Sich Ihr gratis-text-SELECT-Anweisung wird messily gelegt, das macht das Debuggen schwer. Lassen Sie uns Aufräumen der Projektion:
Nun wird es einfach, zu sehen, dass die Reihenfolge der Spalten ist Verschieden von der Art ist die Reihenfolge der attribute:
Also dein code ist, der versucht, eine Zeichenfolge in einen Datum-Variablen (und Umgekehrt, aber zumindest Oracle kann das cast).
Alle, die geht um zu beweisen, dass klare layout ist nicht eine dumme OCD Sache. Disziplin im schreiben von code hilft uns dabei, besser zu schreiben code schneller durch die Hervorhebung der offensichtlichen Fehler.
InformationsquelleAutor APC
Ich denke, dass ich dieses problem angehen, indem man ein synonym für dieses Verfahren, und die Sie neu definieren, auf die entsprechende Quell-Tabelle, bevor Sie sich von ihm. Dann können Sie reguläre SQL sehr einfach ist.
Alternativ, anstelle der Errichtung dieser cursor definieren Sie eine entsprechende insert-Anweisung dynamisch und verwenden Sie execute immediate ausführen.
Den cursor Ansatz ist komplizierter, langsamer und (wie du gesehen hast) mehr Haftung zu haben Codierungsfehler.
InformationsquelleAutor David Aldridge