oracle存储动态sql语句
‘壹’ oracle动态sql语句执行问题
直接调用就可以了。举个例子把 B 存储过程调用A 存储过程。
PROCEDURE A (p_1 in number,p_2 out number)
is
v_1 number;
begin
V_1:=p_1;
p_2:=v_1;
end A;
(1)如果A 与B同在一个package里面的话。那么 B里面直接可以调用A
PS:如果A,B在同一个Package 中无法调用的话,那么很可能是A,B在Spec里没有声明。一个package包含Spec 和Body,两层。不能调用很可能没有声明。声明后应该ok!
PROCEDURE B(p_1 in number)
is
v_result number;
begin
v_result =A(p_1);
end B;
其中v_result就是调用A的结果,A的返回值。
(2)如果A与B不在同一个package的话
那么B在调用A 的时候,需要加上pkg的名字
比如:A 存储过程在pkg :xxom_test_pkg 中
PROCEDURE B(p_1 in number)
is
v_result number;
begin
v_result = xxom_test_pkg .A(p_1);
end B;
----------------------------------------------------------
以上简单介绍了存储过程的调用。
希望对你有帮助
‘贰’ Oracle [存储过程] 执行动态拼接SQL语句并返回结果
建议你用 instr函数,v_sql条件改为
where instr(p_jbm,t.jbm)>0试试吧。
‘叁’ oracle存储过程中如何执行动态SQL语句 详细
有旁御时需要在oracle
存储过程中执行动态SQL
语句
,例如表名是动态的,或字段是动态的,
或查询命令是动态的,可用下面的方法:
set
serveroutput
ondeclaren
number;sql_stmt
varchar2(50);
t
varchar2(20);beginexecute
immediate
'alter
session
set
nls_date_format=''YYYYMMDD''';
t
:=
't_'
||
sysdate;
sql_stmt
:=
'select
count(*)
from
'
||
t;
execute
immediate
sql_stmt
into
n;
dbms_output.put_line('The
number
of
rows
of
'
||
t
||
'
is
'
||
n);end;
如果动态SQL
语句高纳
很运念岩长很复杂,则可用包装.
CREATE
OR
REPLACE
PACKAGE
test_pkgISTYPE
cur_typ
IS
REF
CURSOR;
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ);END;/
CREATE
OR
REPLACE
PACKAGE
BODY
test_pkgISPROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ)ISsqlstr
VARCHAR2(2000);BEGINsqlstr
:=
'SELECT
*
FROM
'||v_table;
OPEN
t_cur
FOR
sqlstr;END;END;/
在oracle
中批量导入,导出和删除表名以某些字符开头的表
spool
c:\a.sql
‘肆’ Oracle存储过程 动态sql报错
execute immediate 'select count(1), count(distinct send_userid) ' ||
'from (select distinct query_key, send_userid ' ||
' from ' || t_name ||
' t where send_time >= trunc( ' || v_date ||
' ) + ( ' || i || ' - 1) / 48 ' ||
' and send_time < trunc(:1) + ' || i ||
' / 48) r '
into SEND_LETTERS1, SEND_UIDS1
using v_date;
into要放在外面,参数也要在外面
‘伍’ oracle数据库动态SQL语句问题
是这样子的:
正常的SQL应该是这样:
SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME='EMP';
然后游态V_SQL:='';最外层也是有引号的
当表名是变量,但是我们查的时候是需要加上单引号的,销磨逗如果最外面的单引号的话,则里面的单引号就需要单引号再加单引号这样来引用的。
所以,如亏卖果你测试你的V_SQL写的正常不正常的话,可以用raise_application_error(-20201,V_SQL);查看,因为这样输出的是正常的sql的哦。
‘陆’ oracle 存储过程 动态sql语句
procere bulupdate语法上的错误
参数定义时的数据类型不能指定长度,varchar2(200)改为varchar2
sqlstring里那个加号去掉
open cursor 时,cursor名应该是定义的过程参数cur
‘柒’ oracle 存储过程执行动态sql实例
oracle的动态sql是指在语句块使用execute immediate 执行sql语句,sql语句可以使用存储过程传的参数进行拼接,本文针对varchar2和number两种类型的参数类型,进行sql拼接并执行。
功能:输入日期区间,销售数量满足上限和下限的产品id
1.正常传值
输出结果
2.若果number类型的参数传空,会报ora-00936:缺失表达式,可以在存储过程中增加对参数null值的判断
oracle 动态拼接传入参数,varchar2类型可以使用'''|| IN_START_DTIME || ''' ,number类型可以使用'||IN_DOWN_LIMIT||' ; 拼接的过程需要注意校验参数的合法性,增加存储过程的容错性。临时表使用了会话级,存储过程执行完,可以通过查询存储过程获取结果。
‘捌’ Oracle 存储过程内部如何执行一个sql语句
用 execute immediate mSql;来执行,也就是Oracle的动态 sql 语句
‘玖’ 怎样SQL存储过程中执行动态SQL语句
1.EXEC的使用
EXEC命令有两种用法,一种是执行一个
存储过程
,另一种是执行一个动态的
批处理
。以下所讲的都是第二种用法。
下面先使用EXEC演示一个例子,代码1
DECLARE
@TableName
VARCHAR(50),@Sql
NVARCHAR
(MAX),@OrderID
INT;
SET
@TableName
=
'Orders';
SET
@OrderID
=
10251;
SET
@sql
=
'SELECT
*
FROM
'+QUOTENAME(@TableName)
+'WHERE
OrderID
=
'+
CAST(@OrderID
AS
VARCHAR(10))+'
ORDER
BY
ORDERID
DESC'
EXEC(@sql);
sp_executesql命令在SQL
Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。
为了和EXEC作一个鲜明的对比,我们看看如果用代码1的代码,把EXEC换成sp_executesql,看看是否得到我们所期望的结果
DECLARE
@TableName
VARCHAR(50),@sql
NVARCHAR(MAX),@OrderID
INT
,@sql2
NVARCHAR(MAX);
SET
@TableName
=
'Orders
';
SET
@OrderID
=
10251;
SET
@sql
=
'SELECT
*
FROM
'+QUOTENAME(@TableName)
+
'
WHERE
OrderID
=
'+CAST(@OrderID
AS
VARCHAR(50))
+
'
ORDER
BY
ORDERID
DESC'
EXEC
sp_executesql
@sql
‘拾’ Oracle创建包含动态sql的存储过程
只能使用动态游标了。
给你个简单例子:
declare
num#number;
recsys_refcursor;
begin
openrecfor'selectcount(*)fromempwhereempno=7788';
fetchrecintonum#;
closerec;
dbms_output.put_line(num#);
end;
/