动态SQL语句的结构,参照下我写的,我的是可以的,
CREATE OR REPLACE FUNCTION ALTER_CONS (I_NAME VARCHAR2,I_BZ INTEGER)
RETURN INTEGER
IS
T_NAME VARCHAR2(30);
T_CONS_NAME VARCHAR2(30);
C_SQL NUMBER;
S_SQL VARCHAR2(500); --ALTER TABLE T_NAME DISABLE CONSTRAINT T_CONS_NAME;
RET NUMBER;
P_ERROR INTEGER;
CURSOR C_CONS IS SELECT A.TABLE_NAME,A.CONSTRAINT_NAME FROM USER_CONSTRAINTS A
WHERE A.R_CONSTRAINT_NAME = (
SELECT B.CONSTRAINT_NAME FROM USER_CONSTRAINTS B
WHERE B.TABLE_NAME=UPPER(I_NAME) AND B.CONSTRAINT_TYPE='P');BEGIN
P_ERROR := 0;
C_SQL := DBMS_SQL.OPEN_CURSOR;
OPEN C_CONS;
LOOP
BEGIN
FETCH C_CONS INTO T_NAME,T_CONS_NAME;
EXIT WHEN C_CONS%NOTFOUND;
IF I_BZ = 0 THEN --把所有与 I_NAME 有关的 CONSTRAINT DISABLE
S_SQL :='ALTER TABLE '||T_NAME||' DISABLE CONSTRAINT '||T_CONS_NAME;
ELSE --恢复与 I_NAME 有关的 CONSTRAINT ENABLE
S_SQL :='ALTER TABLE '||T_NAME||' ENABLE CONSTRAINT '||T_CONS_NAME;
END IF;
DBMS_SQL.PARSE( C_SQL, S_SQL, DBMS_SQL.v7 ) ;
ret := DBMS_SQL.EXECUTE( C_SQL ) ;
EXCEPTION
WHEN OTHERS THEN
P_ERROR := P_ERROR + 1;
END;
END LOOP;
CLOSE C_CONS;
DBMS_SQL.CLOSE_CURSOR(C_SQL);
RETURN P_ERROR;
END ALTER_CONS;
/
SHOW ERROR
CREATE OR REPLACE FUNCTION ALTER_CONS (I_NAME VARCHAR2,I_BZ INTEGER)
RETURN INTEGER
IS
T_NAME VARCHAR2(30);
T_CONS_NAME VARCHAR2(30);
C_SQL NUMBER;
S_SQL VARCHAR2(500); --ALTER TABLE T_NAME DISABLE CONSTRAINT T_CONS_NAME;
RET NUMBER;
P_ERROR INTEGER;
CURSOR C_CONS IS SELECT A.TABLE_NAME,A.CONSTRAINT_NAME FROM USER_CONSTRAINTS A
WHERE A.R_CONSTRAINT_NAME = (
SELECT B.CONSTRAINT_NAME FROM USER_CONSTRAINTS B
WHERE B.TABLE_NAME=UPPER(I_NAME) AND B.CONSTRAINT_TYPE='P');BEGIN
P_ERROR := 0;
C_SQL := DBMS_SQL.OPEN_CURSOR;
OPEN C_CONS;
LOOP
BEGIN
FETCH C_CONS INTO T_NAME,T_CONS_NAME;
EXIT WHEN C_CONS%NOTFOUND;
IF I_BZ = 0 THEN --把所有与 I_NAME 有关的 CONSTRAINT DISABLE
S_SQL :='ALTER TABLE '||T_NAME||' DISABLE CONSTRAINT '||T_CONS_NAME;
ELSE --恢复与 I_NAME 有关的 CONSTRAINT ENABLE
S_SQL :='ALTER TABLE '||T_NAME||' ENABLE CONSTRAINT '||T_CONS_NAME;
END IF;
DBMS_SQL.PARSE( C_SQL, S_SQL, DBMS_SQL.v7 ) ;
ret := DBMS_SQL.EXECUTE( C_SQL ) ;
EXCEPTION
WHEN OTHERS THEN
P_ERROR := P_ERROR + 1;
END;
END LOOP;
CLOSE C_CONS;
DBMS_SQL.CLOSE_CURSOR(C_SQL);
RETURN P_ERROR;
END ALTER_CONS;
/
SHOW ERROR
2 return number
3 is
4 resultvalue NUMBER(8,2);
5 l_str varchar2(1000);
6 cursor_i INTEGER;
7 cursor_ret INTEGER;
8 begin
9 cursor_i:=dbms_sql.open_cursor;
10 l_str:='select count(*) from '||tablename||' where sal >= '||n; -- 注意这里我用了emp表的sal
11 DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
12 cursor_ret := dbms_sql.execute(cursor_i);
13 dbms_sql.define_column(cursor_i, 1, resultvalue);
14 if dbms_sql.fetch_rows(cursor_i) > 0 then
15 dbms_sql.column_value(cursor_i, 1, resultvalue);
16 end if;
17 dbms_sql.close_cursor(cursor_i);
18 return resultvalue;
19* end;
SQL> /Function created.SQL> select getcount('emp',3000) from dual;GETCOUNT('EMP',3000)
--------------------
3SQL>
你是在Oracle8.0.5上执行通过的吗?现在看起来,似乎是Oracle版本的问题,我试了一下,还是老问题:(SQL> create or replace function getCount(tablename in varchar2,n in varchar2)
2 return number
3 is
4 resultvalue NUMBER(8,2);
5 l_str varchar2(1000);
6 cursor_i INTEGER;
7 cursor_ret INTEGER;
8 begin
9 cursor_i:=dbms_sql.open_cursor;
10 l_str:='select count(*) from '||tablename||' where data >= '||n;--这儿改了
11 DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
12 cursor_ret := dbms_sql.execute(cursor_i);
13 dbms_sql.define_column(cursor_i, 1, resultvalue);
14 if dbms_sql.fetch_rows(cursor_i) > 0 then
15 dbms_sql.column_value(cursor_i, 1, resultvalue);
16 end if;
17 dbms_sql.close_cursor(cursor_i);
18 return resultvalue;
19 end;
20 /函数已创建。SQL> select getCount('zltxsh001','10') from dual;
select getCount('zltxsh001','10') from dual
*
错误位于第1行:
ORA-06571: 函数GETCOUNT不能保证不更新数据库
我测试通过了,
create or replace function getCount(tablename varchar2,n varchar2)
return integer
is
resultvalue integer;
l_str varchar2(1000);
cursor_i INTEGER;
cursor_ret INTEGER;
begin
cursor_i:=dbms_sql.open_cursor;
l_str:= 'SELECT COUNT(*) FROM '||tablename||' where data>='||n;
DBMS_SQL.PARSE( cursor_i,l_str, DBMS_SQL.v7 ) ;
DBMS_SQL.DEFINE_COLUMN( cursor_i, 1, resultvalue ) ;
cursor_ret := DBMS_SQL.EXECUTE( cursor_i ) ;
LOOP
IF DBMS_SQL.FETCH_ROWS( cursor_i ) = 0 THEN
EXIT;
END IF;
DBMS_SQL.COLUMN_VALUE( cursor_i, 1, resultvalue ) ;
END LOOP;
dbms_sql.close_cursor(cursor_i);
return resultvalue;
end;
/
SQL> ed
Wrote file afiedt.buf
1 create or replace function getCount(tablename varchar2,n varchar2)
2 return integer
3 is
4 resultvalue integer;
5 l_str varchar2(1000);
6 cursor_i INTEGER;
7 cursor_ret INTEGER;
8 begin
9 cursor_i:=dbms_sql.open_cursor;
10 l_str:= 'SELECT COUNT(*) FROM '||tablename||' where sbh>='||n; --这是我的表的字段,你的是DATA,其他不变
11 DBMS_SQL.PARSE( cursor_i,l_str, DBMS_SQL.v7 ) ;
12 DBMS_SQL.DEFINE_COLUMN( cursor_i, 1, resultvalue ) ;
13 cursor_ret := DBMS_SQL.EXECUTE( cursor_i ) ;
14 LOOP
15 IF DBMS_SQL.FETCH_ROWS( cursor_i ) = 0 THEN
16 EXIT;
17 END IF;
18 DBMS_SQL.COLUMN_VALUE( cursor_i, 1, resultvalue ) ;
19 END LOOP;
20 dbms_sql.close_cursor(cursor_i);
21 return resultvalue;
22* end;
SQL> /Function created.SQL> select getcount('cw_rjzb',1) from dual;GETCOUNT('CW_RJZB',1)
---------------------
64448