在from后面使用變量CREATE OR REPLACE FUNCTION GET_TABLE_COUNT(
I_TabNa IN VARCHAR2 ,
I_Owner IN VARCHAR2 DEFAULT NULL
)
RETURN NUMBER
IS
V_RtnVal NUMBER ;
V_CursorId INTEGER ;
V_SqlStr VARCHAR2(300) ;
BEGIN
V_CursorId := DBMS_SQL.OPEN_CURSOR ; IF LENGTHB( RTRIM( LTRIM( NVL( I_Owner , '' ) ) ) ) = 0 THEN
V_SqlStr := 'SELECT COUNT(*) FROM ' I_TabNa ;
ELSE
V_SqlStr := 'SELECT COUNT(*) FROM ' I_Owner '.' I_TabNa ;
END IF ; DBMS_SQL.PARSE( V_CursorId , V_SqlStr , DBMS_SQL.V7 ) ; DBMS_SQL.DEFINE_COLUMN( V_CursorId , 1 , 0 ) ; IF DBMS_SQL.EXECUTE( V_CursorId ) = 0 THEN
NULL ;
END IF ; IF DBMS_SQL.FETCH_ROWS( V_CursorId ) = 0 THEN
RETURN 0 ;
END IF ; DBMS_SQL.COLUMN_VALUE( V_CursorId , 1 , V_RtnVal ) ; DBMS_SQL.CLOSE_CURSOR( V_CursorId ) ; RETURN V_RtnVal ;
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR( V_CursorId ) ;
-- DBMS_OUTPUT.PUT_LINE( V_SqlStr SQLERRM ) ;
RETURN 0 ;
END GET_TABLE_COUNT;
試驗結果:
SQL> select GET_TABLE_COUNT( 'tab' ) from dual ; GET_TABLE_COUNT('TAB')
----------------------
22 SQL> select GET_TABLE_COUNT( 'sPR' , 'testman') from dual ; GET_TABLE_COUNT('SPR','TESTMAN
------------------------------
15 SQL> select GET_TABLE_COUNT( 'U_Oausr' , 'tm') from dual ; GET_TABLE_COUNT('U_OAUSR','TM'
------------------------------
10 SQL>說明:
-- DBMS_SQL.DEFINE_COLUMN( V_CursorId , 1 , 0 ) ; 里的“0”是什么意思?
DEFINE_COLUMN是用作定義數(shù)據(jù)類型的,不同的數(shù)據(jù)類型有不太的定義方式,這里面的“0”通俗點說就是“與‘0’一樣的數(shù)據(jù)類型的意思”,比如定義長度為200的varchar2型的列的時候,可以簡化為這樣定義:DBMS_SQL.DEFINE_COLUMN( V_CursorId , 1 , 'tmpStr' , 200 ),更多的數(shù)據(jù)類型列的定義請查看Oracle的pl/sql文檔,里面很全。
-- 另外,怎么用聯(lián)編變量?
聯(lián)編變量是一種非常好的傳遞參數(shù)的方式,而且不輕易出錯。但是既然稱之為“聯(lián)編變量”那就是它只能對Oracle中認為的變量進行聯(lián)編,而剛才上面的例子中,表面是不能夠作為變量的,因此不可以聯(lián)編,Oracle中認為出現(xiàn)在邏輯表達式右邊的才是變量,例如可以這樣進行聯(lián)編變量:
......
V_SqlStr := 'SELECT COUNT(*) FROM TAB WHERE TName LIKE :I_Arg0 ' ; DBMS_SQL.PARSE( V_CursorId , V_SqlStr , DBMS_SQL.V7 ) ;
V_TabName := 'MYTAB' ;
DBMS_SQL.BIND_VARIABLE( V_CursorId , ':I_Arg0' , V_TabName '%' ) ;
......
8i以后的版本這樣寫也行
CREATE OR REPLACE FUNCTION GET_TABLE_COUNT(
I_TabNa IN VARCHAR2 ,
I_Owner IN VARCHAR2 DEFAULT NULL
)
RETURN NUMBER
IS
V_RtnVal NUMBER ;
V_TabName VARCHAR2(300) ;
BEGIN
IF LENGTHB( RTRIM( LTRIM( NVL( I_Owner , '' ) ) ) ) = 0 THEN
V_TabName := I_TabNa ;
ELSE
V_TabName := I_Owner '.' I_TabNa ;
END IF ; EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' V_TabName INTO V_RtnVal ;
RETURN V_RtnVal ;
EXCEPTION
WHEN OTHERS THEN
RETURN 0 ;
END GET_TABLE_COUNT ; SQL*PLUS環(huán)境輸入'&字符'的方法我們知道在SQL*PLUS默認環(huán)境里會把'&字符'當成變量來處理. 有些時候我們也需要在SQL>的符號下輸入'&字符', 只需要改變SQL*PLUS下一個環(huán)境變量define即可.
SQL> set define off; 是把默認的&綁定變量的功能取消, 可以把'&字符'當成普通字符處理 SQL> set define on; 打開&綁定變量的功能, &后面的字符串當變量使用. SQL> show define; 查看當前SQL*PLUS的define狀態(tài)
舉例說明:
---------------------------------------------------------------
SQL> CREATE TABLE TEST3 (
ID NUMBER (2) PRIMARY KEY,
NAME VARCHAR2 (20));
SQL> show define;
define "&" (hex 26)
SQL> insert into test3 values(1,'sgs&a&n');
Enter value for a: abc
Enter value for n: 456
old 1: insert into test3 values(1,'sgs&a&n')
new 1: insert into test3 values(1,'sgsabc456') 1 row created. SQL> commit; Commit complete. SQL> set define off; SQL> insert into test3 values(2,'sgs&a&n');
1 row created. SQL> commit; Commit complete.
SQL> select * from test3; ID NAME
-- --------------------
1 sgsabc456
2 sgs&a&n