【问题标题】:Simple Oracle stored procedure简单的 Oracle 存储过程
【发布时间】: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”。

标签: oracle stored-procedures plsql


【解决方案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粘贴到查询字符串中。
猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 2012-07-26
  • 2018-07-15
  • 1970-01-01
  • 2016-05-31
  • 2011-01-03
  • 2011-12-29
相关资源
最近更新 更多