国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

PL/SQL在from后面使用變量,以及輸入'&字符'的方法

2024-07-21 02:33:33
字體:
來源:轉載
供稿:網(wǎng)友
在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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 河曲县| 昌吉市| 海淀区| 资溪县| 高陵县| 涞水县| 丰顺县| 林州市| 灌云县| 灵川县| 泰顺县| 青铜峡市| 南通市| 营山县| 道孚县| 巫溪县| 临桂县| 任丘市| 青州市| 曲松县| 淮南市| 宜兴市| 湘乡市| 北流市| 关岭| 栖霞市| 广宁县| 周至县| 湟源县| 大名县| 托里县| 姜堰市| 苗栗县| 若尔盖县| 元朗区| 乌鲁木齐县| 白玉县| 北票市| 洪洞县| 顺昌县| 砀山县|