Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法创建不存在PL/SQL动态SQL的表_Sql_Oracle_Plsql - Fatal编程技术网

无法创建不存在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都会看到需要创建一个表,即使之前已经创建了一个表。在“干净”的环境中尝试一次测试。我知道在运动中创造桌子不是一个好的做法,但这是我正在学习的课程中的一种锻炼形式,谢谢大家的帮助。谢谢你的回答,正如我所说,这是一种课堂锻炼,我只是想知道这是否可行。