我正在使用SQL Developer Tool创建一个过程,该过程检查名为TRANSPORT_PRODUCT的表是否存在,如果存在,则截断它,如果不存在,则创建它。
场景1:当模式中不存在TRANSPORT_PRODUCT并且我编译过程时,我在编译过程时得到以下错误
Error(44,2): PL/SQL: SQL Statement ignored
Error(44,14): PL/SQL: ORA-00942: table or view does not exist
场景2:如果我创建表TRANSPORT_PRODUCT,然后创建过程并运行,除了在过程中使用以下查询来检查表是否存在之外,一切看起来都很好,其中变量table_exists初始化为0,
select COUNT(*) INTO TABLE_EXISTS from user_tables where table_name= TABLE_NAME;
DBMS_OUTPUT.PUT_LINE('IF 0 THEN TABLE DOES NOT EXISTS ELSE TABLE EXISTS -'||TO_CHAR(TABLE_EXISTS,99));
值48存储在TABLE_EXISTS中。。这对我来说很奇怪:(
场景3:如果我创建TRANSPORT_PRODUCT表,然后创建过程,删除TRANSPORT_PRODUCT并运行过程,我会收到以下消息,我不确定为什么程序依赖于表格!
Error report:
ORA-06550: line 1, column 7:
PLS-00905: object XAAL5.EXPORT_PRODUCT is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
我的程序:
CREATE OR REPLACE PROCEDURE EXPORT_PRODUCT IS
TABLE_NAME VARCHAR2(50) NULL;
TABLE_EXISTS INTEGER:=0;
TRUNC_TABLE VARCHAR2(50) NULL;
CREATE_TABLE VARCHAR2(1000) NULL;
BEGIN
DBMS_OUTPUT.PUT_LINE('Procedure Start Time :' || to_char(systimestamp,'DD-MM-YY HH:MM:SS'));
TABLE_NAME:='TRANSPORT_PRODUCT';
select COUNT(*) INTO TABLE_EXISTS from user_tables where table_name= TABLE_NAME;
DBMS_OUTPUT.PUT_LINE('IF 0 THEN TABLE DOES NOT EXISTS ELSE TABLE EXISTS -'||TO_CHAR(TABLE_EXISTS,99));
IF (TABLE_EXISTS<>0) THEN
BEGIN
DBMS_OUTPUT.PUT_LINE(TABLE_NAME||' TRANSPORT_PRODUCT TABLE EXISTS AND WILL BE TRUNCATED');
TRUNC_TABLE:='truncate table '|| TABLE_NAME;
--DBMS_OUTPUT.PUT_LINE(TRUNC_TABLE);
execute immediate TRUNC_TABLE;
END;
ELSE
BEGIN
DBMS_OUTPUT.PUT_LINE(TABLE_NAME ||' DOES NOT EXISTS AND WILL BE CREATED');
CREATE_TABLE:=
'CREATE TABLE TRANSPORT_PRODUCT (
ROW_NUMBER NUMBER,
PRODUCTID VARCHAR2(20),
PRODUCTNAME VARCHAR2(100),
OWNER VARCHAR2(20),
DIVISIONID VARCHAR2(20),
MERCHLEVEL1 VARCHAR2(20),
MERCHLEVEL2 VARCHAR2(20),
MERCHLEVEL3 VARCHAR2(20),
MERCHLEVEL4 VARCHAR2(20),
STREAMID VARCHAR2(20),
SPECIFICATION VARCHAR2(20),
SSS VARCHAR2(20))';
execute immediate CREATE_TABLE;
END;
END IF;
-- INSERT PRODUCT INTO TRANSPORT_PRODUCT
INSERT INTO TRANSPORT_PRODUCT (ROW_NUMBER,PRODUCTID,PRODUCTNAME,OWNER, DIVISIONID,MERCHLEVEL1, MERCHLEVEL2, MERCHLEVEL3,MERCHLEVEL4,STREAMID,SPECIFICATION,SSS)
SELECT ROWNUM,
PRODUCTID,
PRODUCTNAME,
OWNER,
DIVISIONID,
MERCHLEVEL1,
MERCHLEVEL2,
MERCHLEVEL3,
MERCHLEVEL4,
STREAMID,
SPECIFICATION,
SSS
FROM PRODUCT;
DBMS_OUTPUT.PUT_LINE('Procedure End Time :' || to_char(systimestamp,'DD-MM-YY HH:MM:SS'));
exec buildfile('select * from TRANSPORT_PRODUCT where rownum<=500');
commit;
END;
我可以看到场景2的问题是,您使用的过程参数名称TABLE_name与列名USER_TABLES相同。然后查询会给出模式中的表总数。TABLE_NAME=TABLE_NAME始终匹配。
我认为你的手术也是如此。您可以在过程中静态地使用该表。
谢谢当做