PL/SQL Developer 执行以下PL/SQL语句:
--创建无参存储过程
CREATE OR REPLACE FUNCTION CreateTables RETURN VARCHAR2 IS
    --声明语句段
    v_SQL varchar2(10000);
BEGIN
    --执行语句段
    /*
Create by zjc  2012-06-29
指标分解总表*/v_SQL :=  '
create table TB_TGT_DECOM_TABLES
(
  id     VARCHAR2(40) not null,
  prod_type   NUMBER(4), 
  designer      VARCHAR2(40),  
  year    NUMBER(5), 
  name    VARCHAR2(40), 
  pro_comment VARCHAR2(200)  
)
 ';execute immediate v_SQL;commit;END CreateTables;
declare
  str varchar2(1000);
   CURSOR tname_cursor IS
   SELECT table_name
   FROM user_tables
   where table_name like 'TB_TGT_%';
  
    begin
    
   CreateTables();
  
END;      执行中无错误发生,然后新开一个窗口查询自己新建的表: SELECT table_name
   FROM user_tables
   where table_name like 'TB_TGT_%';
    什么结果也查询不到。直接使用创建表的语句:
create table TB_TGT_DECOM_TABLES
(
  id     VARCHAR2(40) not null,
  prod_type   NUMBER(4), 
  designer      VARCHAR2(40),  
  year    NUMBER(5), 
  name    VARCHAR2(40), 
  pro_comment VARCHAR2(200)  
)
    这个倒是可以查询得到新建的表。为何用PL/SQL语句建表不成功呢?

解决方案 »

  1.   

    看下all_tables下创建表的owner是谁
      

  2.   

    也有可能是lz打开了两个窗口,而这两个窗口连接的是不同的DB~
      

  3.   

    lz看看新开的窗口是不是连接的同一个DB~
      

  4.   

    function 可以执行这个吗?  换成procedure吧。 
      

  5.   


         请问创建function的语句和调用functin的语句是不是需要分开两步执行啊?
      

  6.   


         能不能一步执行呢?分两步执行多麻烦啊!PL/SQL还号称过程化的sql语句呢,创建function的语句和调用functin的语句还需要分两步执行。应该像C语言一样,定义了一个函数,然后所有函数都在main函数里执行,一次执行就行,类似于:
    void a(void)
    {}void b(void)
    {}void main(void)
    {
        a();
        b();
    }
      

  7.   

    有可能是用户没有显式授权create table 的权限,好像有时候是会出现权限不足而无法创建表的情况的。
    这时就需要要在Execute之前先grant create table to user;