简单的 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程返回游标,取值报错

简单的 Oracle 存储过程

测试 Oracle 存储过程的最简单方法

Oracle 的存储过程怎么写。?

请问如何用c++ 调用oracle存储过程?

急求!怎么建立oracle存储过程(实例)