简单的 Oracle 存储过程
Posted
技术标签:
【中文标题】简单的 Oracle 存储过程【英文标题】:Simple Oracle stored procedure 【发布时间】:2019-10-15 17:19:19 【问题描述】:我有这个 SQL 查询:
select title
from DEPARTMENT;
我尝试写一个存储过程:
create PROCEDURE select_some
(whats VARCHAR2 ,c_select_some OUT SYS_REFCURSOR)
AS
BEGIN
OPEN c_select_some FOR
SELECT whats
FROM department;
END select_some;
/
但是在我使用“title”参数执行它的地方,我得到了 8 行带有“title”而不是实际内容的行。怎么了?
执行:
var whats varchar2(20)
variable whats = 'Title'
variable mycursor refcursor;
exec select_some (:whats, mycursor);
【问题讨论】:
SELECT whats
= SELECT 'Title'
,因为过程的whats
参数被赋予Title
参数(variable whats = 'Title'
),这就是为什么将返回尽可能多的值为Title
的行department
表中的行。你到底想完成什么?如果你想动态传递列名,你应该看看动态 SQL
只需从 DEPARTMENT 中选择 some_param;这将返回 8 行,我只想要参数化的 sql 查询
这不是“参数化 sql 查询”的意思。如前所述,您想要的是“动态 SQL”。
【参考方案1】:
为此,您需要使用动态 SQL。
类似的东西
create or replace procedure select_from_department(
col_name in varchar2,
c_res out sys_refcursor
)
is
l_sql varchar2(300);
begin
l_sql := 'select ' || dbms_assert.simple_sql_name(col_name) || ' from departments';
open c_res for l_sql ;
end;
DEMO
【讨论】:
加一个用于使用dbms_assert.simple_sql_name
而不是简单地将col_name
粘贴到查询字符串中。以上是关于简单的 Oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章