I USE DBMS_SQL SYSTEM PACKAGE FOR PARSE SQL STATEMENT, BUT RETURN A NULL VALUEL
FOLLOWING IS THE CODE:
-----
DECLARE
V_CURSOR INT;
V_RECNT  INT;
V_RESULT TBL1.FIELD1%TYPE;
V_SQLSTM VARCHAR2(100):= 'SELECT FIELD1 FROM TBL1'||
                         ' WHERE FIELD2=:AA';
BEGIN
 DBMS_SQL.PARSE(V_CURSOR,V_SQLSTM,DBMS_SQL.NATIVE);
 DBMS_SQL.BIND_VARIABLE(V_CURSOR,':AA',44);
 DBMS_SQL.DEFINE_COLUMN(V_CURSOR,1,V_RESULT);
 V_RECNT:=DBMS_SQL.EXECUTE(V_CURSOR);
 DBMS_SQL.COLUMN_VALUE(V_CURSOR,1,V_RESULT);
END;

解决方案 »

  1.   

    你的数据库什么版本? 8i以下?
     8i可以使用execute immediate ... 参考:
    create or replace procedure DynamicQuery(p_StrSQL in string)
    is 
    v_CursorID INTEGER; 
    v_SelectStmt VARCHAR2(500); 
    v_Dummy INTEGER; 
    v_ReturnRow INTEGER; 
    v_MailID VARCHAR2(20); 
    begin --打开游标 
    v_CursorID:=DBMS_SQL.OPEN_CURSOR; --将传入的SQL文付给已经定义的变量 
    v_SelectStmt:=p_StrSQL; --利用DBMS_SQL包的内置函数解析SQL文 
    DBMS_SQL.PARSE(v_CursorID,v_SelectStmt,DBMS_SQL.V7); --定义需要输出的变量 
    DBMS_SQL.DEFINE_COLUMN(v_CursorID,1,v_MailID,20); --执行SQL文,如果是DML语句,则返回处理的行数 
    v_Dummy:=DBMS_SQL.EXECUTE(v_CursorID); loop --将匹配查询的行提取到缓冲区,每次一行,返回取到的行数,=0表示不再取到值 
    v_ReturnRow:=DBMS_SQL.FETCH_ROWS(v_CursorID); 
    if v_ReturnRow=0 then 
    exit; 
    end if; --将缓冲区中的数据提取到PL/SQL变量中 
    DBMS_SQL.COLUMN_VALUE(v_CursorID,1,v_MailID); 
    end loop; --关闭游标 
    DBMS_SQL.CLOSE_CURSOR(v_CursorID); EXCEPTION 
    when others then 
    DBMS_SQL.CLOSE_CURSOR(v_CursorID); 
    raise; end DynamicQuery;