数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2021年04月25日
 
PL/SQL在from后面使用变量,以及输入&字符的方法

在from后面使用变量

CREATE OR REPLACE FUNCTION GET_TABLE_COUNT(

I_TabNa IN VARCHAR

I_Owner IN VARCHAR DEFAULT NULL

)

RETURN NUMBER

IS

V_RtnVal NUMBER ;

V_CursorId INTEGER ;

V_SqlStr VARCHAR() ;

BEGIN

V_CursorId := DBMS_SQLOPEN_CURSOR ;

IF LENGTHB( RTRIM( LTRIM( NVL( I_Owner ) ) ) ) = THEN

V_SqlStr := SELECT COUNT(*) FROM || I_TabNa ;

ELSE

V_SqlStr := SELECT COUNT(*) FROM || I_Owner|| || I_TabNa ;

END IF ;

DBMS_SQLPARSE( V_CursorId V_SqlStr DBMS_SQLV ) ;

DBMS_SQLDEFINE_COLUMN( V_CursorId ) ;

IF DBMS_SQLEXECUTE( V_CursorId ) = THEN

NULL ;

END IF ;

IF DBMS_SQLFETCH_ROWS( V_CursorId ) = THEN

RETURN ;

END IF ;

DBMS_SQLCOLUMN_VALUE( V_CursorId V_RtnVal ) ;

DBMS_SQLCLOSE_CURSOR( V_CursorId ) ;

RETURN V_RtnVal ;

EXCEPTION

WHEN OTHERS THEN

DBMS_SQLCLOSE_CURSOR( V_CursorId ) ;

DBMS_OUTPUTPUT_LINE( V_SqlStr || SQLERRM ) ;

RETURN ;

END GET_TABLE_COUNT;

试验结果

SQL> select GET_TABLE_COUNT( tab ) from dual ;

GET_TABLE_COUNT(TAB)

SQL> select GET_TABLE_COUNT( spr testman) from dual ;

GET_TABLE_COUNT(SPRTESTMAN

SQL> select GET_TABLE_COUNT( U_Oausr tm) from dual ;

GET_TABLE_COUNT(U_OAUSRTM

SQL>

说明

DBMS_SQLDEFINE_COLUMN( V_CursorId ) ; 里的是什么意思?

DEFINE_COLUMN是用作定义数据类型的不同的数据类型有不太的定义方式这里面的通俗点说就是一样的数据类型的意思比如定义长度为的varchar型的列的时候可以简化为这样定义DBMS_SQLDEFINE_COLUMN( V_CursorId tmpStr )更多的数据类型列的定义请查看oracle的pl/sql文档里面很全

另外怎么用联编变量?

联编变量是一种非常好的传递参数的方式而且不容易出错但是既然称之为联编变量那就是它只能对Oracle中认为的变量进行联编而刚才上面的例子中表面是不能够作为变量的因此不可以联编Oracle中认为出现在逻辑表达式右边的才是变量例如可以这样进行联编变量

V_SqlStr := SELECT COUNT(*) FROM TAB WHERE TName LIKE :I_Arg ;

DBMS_SQLPARSE( V_CursorId V_SqlStr DBMS_SQLV ) ;

V_TabName := MYTAB ;

DBMS_SQLBIND_VARIABLE( V_CursorId :I_Arg V_TabName || % ) ;

i以后的版本这样写也行

CREATE OR REPLACE FUNCTION GET_TABLE_COUNT(

I_TabNa IN VARCHAR

I_Owner IN VARCHAR DEFAULT NULL

)

RETURN NUMBER

IS

V_RtnVal NUMBER ;

V_TabName VARCHAR() ;

BEGIN

IF LENGTHB( RTRIM( LTRIM( NVL( I_Owner ) ) ) ) = 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 ;

END GET_TABLE_COUNT ;

SQL*PLUS环境输入&字符的方法

我们知道在SQL*PLUS默认环境里会把&字符当成变量来处理

有些时候我们也需要在SQL>的符号下输入&字符 只需要改变SQL*PLUS下一个环境变量define即可

SQL> set define off;

是把默认的&绑定变量的功能取消 可以把&字符当成普通字符处理

SQL> set define on;

打开&绑定变量的功能 &后面的字符串当变量使用

SQL> show define;

查看当前SQL*PLUS的define状态

举例说明:

SQL> CREATE TABLE TEST (

ID NUMBER () PRIMARY KEY

NAME VARCHAR ());

SQL> show define;

define & (hex )

SQL> insert into test values(sgs&a&n);

Enter value for a: abc

Enter value for n:

old : insert into test values(sgs&a&n)

new : insert into test values(sgsabc)

row created

SQL> commit;

Commit complete

SQL> set define off;

SQL> insert into test values(sgs&a&n);

row created

SQL> commit;

Commit complete

SQL> select * from test;

ID NAME

sgsabc

sgs&a&n

上一篇:数据库活动监控系列之SQL注入攻击

下一篇:VFP中调用Oracle的存储过程