无法创建不存在PL/SQL动态SQL的表
我试图检查一个表是否存在,如果它不存在,那么它必须被创建,但是当我试图在假定它已经被创建的情况下向其中插入数据时,我在下面遇到了一个错误。 这是我的剧本:无法创建不存在PL/SQL动态SQL的表,sql,oracle,plsql,Sql,Oracle,Plsql,我试图检查一个表是否存在,如果它不存在,那么它必须被创建,但是当我试图在假定它已经被创建的情况下向其中插入数据时,我在下面遇到了一个错误。 这是我的剧本: PROCEDURE CREAR_CLAVES AS VERIFACION INTEGER; BEGIN SELECT COUNT(TNAME) INTO VERIFACION FROM TAB WHERE TNAME = 'CLAVES'; IF VERIFACION = 0 THEN EXECUTE IMMEDIATE
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;
我得到的表或视图不存在错误。
知道如何解决吗?最可能的问题是编译过程时clave不存在。它甚至没有达到检查它的存在并创造它的程度 您可以通过将“INSERT INTO CLAVES…”语句放入execute immediate来解决此问题。在此处使用绑定变量以避免任何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;
/
顺便说一句,我也不同意在飞行中创造克拉维。此外,最好在一个“insert as select”语句中实现游标循环和逐行缓慢插入,除非这里有一个非常具体的、过程性很强的逻辑将ESTUDIATES行转换为CLAVE。Hi,在pl/sql中创建表不是一个好方法,请在解决方案中重新思考,有一种更好的方法可以在不在运行时创建这样的表的情况下完成这项工作,如果您提供您想要做的事情,也许我们可以提供帮助:如果表确实存在,并且它已经有了您想要添加的约束:那么呢?这不是一种好方法。但是,实际的问题可能是,在创建表之后,您没有向选项卡插入行,因此每次运行CREAR_CLAVES都会看到需要创建一个表,即使之前已经创建了一个表。在“干净”的环境中尝试一次测试。我知道在运动中创造桌子不是一个好的做法,但这是我正在学习的课程中的一种锻炼形式,谢谢大家的帮助。谢谢你的回答,正如我所说,这是一种课堂锻炼,我只是想知道这是否可行。