[英]Can't create a table that does not exist with PL/SQL Dynamic SQL
我試圖檢查一個表是否存在,如果不存在,則必須創建它,但是當我假設已經創建了表中的數據時,我在下面遇到了一個錯誤。 這是我的腳本:
PROCEDURE CREAR_CLAVES
AS
VERIFACION INTEGER;
BEGIN
SELECT COUNT(TNAME) INTO VERIFACION FROM TAB WHERE TNAME = 'CLAVES';
IF VERIFACION = 0 THEN
EXECUTE IMMEDIATE 'CREATE TABLE CLAVES (IDESTUDIANTE NUMBER(5) PRIMARY KEY, USUARIO VARCHAR2(1000), CONTRASENA VARCHAR2(1000))';
EXECUTE IMMEDIATE 'ALTER TABLE CLAVES ADD CONSTRAINT FK_IDESTUDIANTE FOREIGN KEY (IDESTUDIANTE) REFERENCES ESTUDIANTES(ID)';
ELSE
DBMS_OUTPUT.PUT_LINE('LA TABLA YA EXISTE');
END IF;
END CREAR_CLAVES;
PROCEDURE IDENTIFICAR_ESTUDIANTES
AS
VESTUDIANTES SYS_REFCURSOR;
ACTUAL ESTUDIANTES%ROWTYPE;
CONSULTA VARCHAR2(1000);
BEGIN
CONSULTA := 'SELECT ID, NOMBRE, APELLIDO FROM ESTUDIANTES';
OPEN VESTUDIANTES FOR CONSULTA;
FETCH VESTUDIANTES INTO ACTUAL;
WHILE VESTUDIANTES%FOUND
LOOP
INSERT
INTO CLAVES VALUES
(
ACTUAL.ID,
LOWER(ACTUAL.APELLIDO)
||LOWER(ACTUAL.NOMBRE),
LOWER(ACTUAL.NOMBRE)
||DBMS_RANDOM.VALUE(100, 999)
);
FETCH VESTUDIANTES INTO ACTUAL;
END LOOP;
CLOSE VESTUDIANTES;
END IDENTIFICAR_ESTUDIANTES;
我得到表或視圖不存在錯誤。 知道如何解決嗎?
最有可能的問題是,在編譯過程時,CLAVES不存在。 它甚至沒有達到檢查其存在並創建它的地步。
您可以通過將“ INSERT INTO CLAVES ...”語句放入立即執行語句來解決該問題。 在此處使用綁定變量可避免SQL注入的任何可能性:
CREATE or replace PROCEDURE IDENTIFICAR_ESTUDIANTES
AS
VESTUDIANTES SYS_REFCURSOR;
ACTUAL ESTUDIANTES%ROWTYPE;
CONSULTA VARCHAR2(1000);
BEGIN
CONSULTA := 'SELECT ID, NOMBRE, APELLIDO FROM ESTUDIANTES';
OPEN VESTUDIANTES FOR CONSULTA;
FETCH VESTUDIANTES
INTO ACTUAL;
WHILE VESTUDIANTES%FOUND LOOP
execute immediate 'INSERT INTO CLAVES VALUES (:IDESTUDIANTE, :USUARIO, :CONTRASENA)'
using ACTUAL.ID, LOWER(ACTUAL.APELLIDO)||LOWER(ACTUAL.NOMBRE), LOWER(ACTUAL.NOMBRE)||DBMS_RANDOM.VALUE(100, 999);
FETCH VESTUDIANTES
INTO ACTUAL;
END LOOP;
CLOSE VESTUDIANTES;
END IDENTIFICAR_ESTUDIANTES;
/
順便說一句,我也不希望即時創建CLAVES。 此外,最好在單個“作為選擇插入”語句中實現游標循環和逐行(逐行(slow-by-slow))插入,除非您在此處具有非常具體的,過程繁重的邏輯來轉換將行估計為CLAVES。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.