簡體   English   中英

無法創建PL / SQL動態SQL不存在的表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM