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