Wie verwenden Sie bind-Variablen in plsql?
Einfache Aufgabe
variable dept_id NUMBER
DECLARE
max_deptno NUMBER;
dept_name departments.department_name%TYPE := 'Education';
BEGIN
select max(department_id)
into max_deptno
from departments;
:dept_id := max_deptno + 10;
insert into departments (department_id, department_name, location_id)
values (:dept_id, dept_name, null);
DBMS_OUTPUT.PUT_LINE('The maximum department id is ' || max_deptno);
DBMS_OUTPUT.PUT_LINE('Rows made by insert: ' || SQL%ROWCOUNT);
END;
max_deptno ist nicht NULL. Warum dept_id ist NULL nach der Zuweisung? Was mache ich falsch?
Skript-Ausgabe:
MAX(DEPARTMENT_ID)
------------------
520
Error starting at line 10 in command:
DECLARE
max_deptno NUMBER;
dept_name departments.department_name%TYPE := 'Education1';
BEGIN
select max(department_id)
into max_deptno
from departments;
:dept_id := max_deptno + 10;
insert into departments (department_id, department_name, location_id)
values (:dept_id, dept_name, null);
DBMS_OUTPUT.PUT_LINE('The maximum department id is ' || max_deptno);
DBMS_OUTPUT.PUT_LINE('Rows made by insert: ' || SQL%ROWCOUNT);
END;
Fehlermeldung:
ORA-01400: невозможно вставить NULL в ("ANDKOM"."DEPARTMENTS"."DEPARTMENT_ID")
ORA-06512: на line 9
01400. 00000 - "cannot insert NULL into (%s)"
*Cause:
*Action:
- Woher wissen Sie, dass
MAX_DEPTNO
ist NICHT NULL? Können Sie uns zeigen die Ergebnisse derSELECT MAX(department_id) FROM andkom.departments
? - MAX(DEPARTMENT_ID) 520
- OK. Können Sie Ausschneiden und einfügen aus einer einzigen SQL*Plus-Sitzung, wo Sie 1) definieren Sie die host-variable
DEPT_ID
, 2)set serveroutput on
, 3)SELECT MAX(department_id) from andkom.departments
, und dann 4) führen Sie den PL/SQL-block, den Sie gepostet? Etwas macht keinen Sinn. - Ich benutze SQL Developer
- OK. Dann führen Sie diese Anweisungen als Skript aus (F5), und kopieren und fügen Sie den Skript-Ausgabe.
- Ich habe aktualisiert, Frage mit dieser info (am Ende)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die host-variable
DEPT_ID
ist nicht NULL nach der Zuweisung. Das problem ist, dass IhrINSERT
- Anweisung ist die Verwendung der lokalen variableNEW_DPT
imINSERT
und dass die lokale variable der kein Wert zugewiesen wurde. Wenn Sie wirklich wollen, um mit einem host-variable in PL/SQL (Sie würde im wesentlichen nie tun dies im wirklichen Leben), die Sie benötigen würden, Sie in Ihre PL/SQL-blockMehr realistisch, jedoch wäre zu überlegen die substitution variable ganz
INSERT
Anweisung bind-Variablen als auch im Kontext dessen, was Menschen in der Regel bedeuten, wenn Sie sprechen über die bind-Variablen.HR
mit der vollenHR
sample-schema. Ich gehe davon aus, dass das, was du tust, wie gut?Habe ich die gleiche Frage gestellt im oracle-forum und bekam die Antwort: