2017-11-11 222 views
1

我所试图做的PL/SQL PLS-00208:标识符“类型”是不是合法的光标属性

我想写使用Dynamic SQL创建表的过程。

什么问题

我收到以下错误,而编译程序:

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/5  PL/SQL: Statement ignored 
4/80  PLS-00208: identifier 'TYPE' is not a legal cursor attribute 

步骤:

create or replace procedure createTab is 

    begin 
     EXECUTE IMMEDIATE 'create table thisYearCustomerNames (id ' || customer.id%type || ', name ' || 
                   customer.name%type || ', points ' || 
                   customer.points%type || ')'; 
    end; 
    /

客户表

Name    Null?  Type 
----------------------------------------- 
ID    NOT NULL NUMBER(5) 
NAME       VARCHAR2(30) 
ADDRESS      VARCHAR2(40) 
POINTS   NOT NULL NUMBER(10) 
DATE_OF_JOINING    DATE 
GENDER      CHAR(1) 
+2

动态SQL很难写,因为它会将编译错误转化为运行时错误。我建议你从编写静态SQL开始,并确保你有一个在SQL Developer中运行的有效语句(或者你使用的任何东西)。完成之后,您可以将其转换为动态代码。 – APC

+0

我使用notepad ++代码,并使用'@'运算符作为文件在sql终端中运行它。这是一个好方法吗?并非常感谢你的宝贵建议。再次感谢您花时间制作出这样一个不错的建议。会尝试它。 – Ahtisham

+1

我认为这是初学者的最佳方式。你手写的SQL越多,学到的东西越多。太多的人从IDE开始,以牺牲理解为代价让他们产生幻觉。 – APC

回答

3

您正试图创建一个表%type属性,这是不允许的。

%TYPE属性只允许作为PL/SQL变量,并且在创建表时不能使用。

作为每Oracle文档,%TYPE

的%TYPE属性可以声明一个常数,变量,收集 元件,记录字段,或子程序参数是相同的数据的 类型如先前声明的变量或列

所以,如果你需要创建一个表具有相同的定义的Customer,没有数据,使用Create table as select * 0行。

即,

create table thisYearCustomerNames AS SELECT id,name,points FROM customer where ROWNUM < 1; 

而你正在试图将外EXECUTE IMMEDIATE...id ' || customer.id%type列名 - 这也不会奏效。这是合适的方式。

BEGIN 
    EXECUTE IMMEDIATE 'create table thisYearCustomerNames AS SELECT id,name,points 
    FROM customer where ROWNUM < 1'; 
END; 
+0

谢谢,这很容易。 :)和平与你同行bro:D – Ahtisham

+1

只需要添加,'%type'不是在运行时展开的标签。它是PL/SQL编译器的指令。 –