方法:
CREATE OR REPLACE FUNCTION F()
IS
BEGIN
    strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
    EXECUTE IMMEDIATE strSQL_CREATE;
END
调用
--set serveroutput on;
declare
begin
    F();
end;出错--set serveroutput on;
declare
CREATE OR REPLACE FUNCTION F()
IS
BEGIN
    strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
    EXECUTE IMMEDIATE strSQL_CREATE;
ENDbegin
    F();
end;不出错  求教为什么~?

解决方案 »

  1.   

    函数需要返回值create or replace function f() return 返回值类型
    is
    ...
      

  2.   


    方法:
    CREATE OR REPLACE FUNCTION F()
    RETURN number
    IS
    BEGIN
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
        RETURN  1;
    END
    调用
    --set serveroutput on;
    declare
       intRTN number;
    begin
        intRTN := F();
    end;出错--set serveroutput on;
    declare
       intRTN number;
    CREATE OR REPLACE FUNCTION F()
    RETURN number
    IS
    BEGIN
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
        return 1;
    ENDbegin
        intRTN := F();
    end;
      

  3.   

    不要用function,用procedure吧CREATE OR REPLACE PROCEDURE F
    IS
      strSQL_CREATE VARCHAR2(1000);
    BEGIN
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
    END;
    /调用
    begin
        F;
    end;
    /
      

  4.   

    CREATE OR REPLACE procedure f
    IS
       strSQL_CREATE varchar2(100);
    BEGIN
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
    END;用过程,变量也没有声明;
      

  5.   

    function必须带参数的,如下面的就可以了create or replace function ff(p_null in varchar2) return int
    IS
        strSQL_CREATE varchar2(1000);
    BEGIN
        strSQL_CREATE := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
        
        return 1;
    END;不过呢,这种事情在function里做让人感觉很不普通
      

  6.   

    上面的不是我的源程序 只是其中的一部分~
    全写出来太多了
    F()方法在源程序里没有任何问题 参数在上面的代码里没有写不要说语法之类的错误 xx没定义什么的我只想知道为什么两段代码前一段创建表会不成功
    而后一段会成功
      

  7.   

    你这里出的错,是不是没有权限的错,如果是的话,我就遇到过,虽然我已经给用户resource的role,完全包含create any table的权限,但是还是提示没有权限。解决方法,要通过显式的方式使用对象权限或者系统权限来赋权限才行。
    SQL>grant create table to username;
    或者
    SQL>grant create any table to username;查看oracle的文档,提到,在procedure和function里,role privilege是失效的。你试试,如果是报的这个错的话。有错最好贴出来,这样大家不需要猜来猜去浪费时间了。
      

  8.   


    CREATE OR REPLACE FUNCTION FF(in_csvfile IN  VARCHAR)
    RETURN number
    IS
    strSQL_CREATE VARCHAR2(1000);
    BEGIN
        --TEMP_TABLEを作成する
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10) , SIKENSU_NO VARCHAR2(10) , SAIBAN VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
        RETURN 0;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN -1;
    END;
    --set serveroutput on;
    declare
       intRTN number;
    begin
       dbms_output.ENABLE (25000);
      intRTN := FF('ASDAA');
       dbms_output.put_line('intRTN:' || intRTN);
       dbms_output.put_line('----end--------');
    end;
    返回结果:
    intRTN:-1
    ----end--------
    --set serveroutput on;
    declare
       intRTN number;
    FUNCTION FF(in_csvfile IN  VARCHAR)
    RETURN number
    IS
    strSQL_CREATE VARCHAR2(1000);
    BEGIN
        --TEMP_TABLEを作成する
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10) , SIKENSU_NO VARCHAR2(10) , SAIBAN VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
        RETURN 0;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN -1;
    END;
    begin
       dbms_output.ENABLE (25000);
      intRTN := FF(‘asddf');
       dbms_output.put_line('intRTN:' || intRTN);
       dbms_output.put_line('----end--------');
    end;
    返回结果:
    intRTN:-1
    ----end--------
      

  9.   

    把excption raise出来呀,都被你hold住了,怎么出现的了error message呀。
      

  10.   


    --set serveroutput on;
    declare
       intRTN number;
    FUNCTION FF(in_csvfile IN  VARCHAR)
    RETURN number
    IS
    strSQL_CREATE VARCHAR2(1000);
    BEGIN
        --TEMP_TABLEを作成する
        strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR2(10) , SIKENSU_NO VARCHAR2(10) , SAIBAN VARCHAR2(10))';
        EXECUTE IMMEDIATE strSQL_CREATE;
        RETURN 0;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN -1;
    END;
    begin
       dbms_output.ENABLE (25000);
      intRTN := FF(‘asddf');
       dbms_output.put_line('intRTN:' || intRTN);
       dbms_output.put_line('----end--------');
    end;
    返回结果:
    intRTN:0
    ----end--------
      

  11.   

    你创建表时,应该先确定TEMP_TABLE是否已经存在,如果已经存在,那你当然建立不成功,RETURN -1了,
    建议你这样写:
      strSQL_CREATE  := 'DROP TABLE TEMP_TABLE';
       EXECUTE IMMEDIATE strSQL_CREATE;
      strSQL_CREATE  := 'CREATE TABLE TEMP_TABLE (TABLE_NM VARCHAR(10)....)';
       EXECUTE IMMEDIATE strSQL_CREATE;