Oracle 数据库中的存储过程 (11g)

Posted

技术标签:

【中文标题】Oracle 数据库中的存储过程 (11g)【英文标题】:Stored procedures in Oracle databases (11g) 【发布时间】:2021-05-22 17:24:10 【问题描述】:

我已经为此苦苦挣扎了一段时间。

我想创建 3 个不同的存储过程,但我不太确定 关于语法以及如何在 Oracle 数据库(版本 11g)中执行它们

我的表包含这些列,这是定义:

身份证号码

金额 VARCHAR2(30)

日期 VARCHAR2(30)

我想创建一个程序,允许我从一个表中获取所有行,这就是我所做的:

create or replace PROCEDURE GetAllRows(cursor_ OUT SYS_REFCURSOR) AS
BEGIN
OPEN cursor_ FOR
    SELECT *
      FROM My_Table  
END GetAllRows;   

没事吧?我应该如何执行它?


另外,我想在该表中插入一些信息,所以我创建了另一个 SP:

CREATE PROCEDURE insert_row(
                    id IN NUMBER,
                    amount IN VARCHAR,
                    date IN VARCHAR

                        )
IS
BEGIN

INSERT INTO My_table(id, amount, id) VALUES (id, amount, date);

END insert_row;

没事吧?我应该如何执行?

我对 Oracle 数据库有点迷茫。

【问题讨论】:

关于第一个例子,我们可以使用视图来存储查询。您可以拥有返回游标的过程,但您需要编写代码来处理游标,直到 Oracle 12.1(请参阅***.com/a/40360471/230471)。除非查询是复杂和动态的,否则不值得为这类事情使用过程。 【参考方案1】:

请尝试使用以下代码获取存储过程输出。

variable rc refcursor;
exec GetAllRows( :rc );
print rc;

【讨论】:

嘿朋友,谢谢你的回复我不明白。我的 SP 写得好吗? 是的,两个SP都可以 能否请您告诉我如何在插入语句中执行 SP? @Belayer - 你打败了我。我还要补充一点,用下划线('cursor_')开始或结束名称可能也不是一个好主意。从技术上讲,它会起作用,但我担心一些维护代码的人会误读/误输入它。保存下划线以连接两个单词。 采摘。命名格式一致性。永远不要使用 CamelCase(oracle 会吐回 CAMELCASE)使其难以阅读。纯粹是个人喜好,我喜欢特定的例程名称,所以可能是“get_mytable_rows”和“insert_mytable_row”。我把所有的东西都写成小写(很多人会不同意)。重要的不是你如何写作(在合理范围内)。但是3 个非常重要的 概念: 1、名称很重要 选择它们并深思熟虑。 2. 代码必须易于阅读,否则无法理解。 3. 选择你的风格,然后始终保持一致。【参考方案2】:

如果不能举个例子就很难谈论“风格”或“写得好”,而 SO 的框架只允许在“答案”而不是“评论”中。因此,我将扩展“答案”的含义并向您展示我将如何对其进行编码:

CREATE PROCEDURE insert_row(p_descriptive_id IN NUMBER,
                            p_descriptive_amount IN VARCHAR,
                            p_descriptive_date IN VARCHAR
                            )
IS
BEGIN

   INSERT INTO My_table(descriptive_id, 
                        descriptive_amount, 
                        descriptive_date) 
                 VALUES (p_descriptive_id, 
                         p_descriptive_amount, 
                         p__descriptive_date);

END insert_row;

评论:

    所有字段和列名都是“描述性的” - adjective_noun 格式 所有参数都以“p_”开头,以区分投注。参数和列。有些人喜欢一个前缀来表明它是输入还是输出参数(i_descriptive_input,o_descriptive_output。 在您的 INSERT 行中,列名(和值)在一列中,而不是在单行上串起来。基本规则,逗号分隔的列表应在逗号上换行,以便列表位于一列中。更容易阅读和了解那里的内容。当您需要确保表列和值匹配时,尤其是在 INSERT 上。

【讨论】:

非常感谢您的回复,这意味着看,伙计。我能问你一件事吗?您将如何选择 SP 中的所有元组或某些列?它会和我创建的相似吗?在 Oracle DATABASE(11g 版本)中是否存在不同的创建方式? 取决于您要对它们做什么。可以肯定的是,除了临时查询之外,您应该简单地“从 my_table 中选择 *”。如果要更改表结构,这样的语句可能会破坏您的代码。大概,在生产代码中你知道你需要哪些列——所以列出它们:'select emp_id, first_name, last_name from employees'。

以上是关于Oracle 数据库中的存储过程 (11g)的主要内容,如果未能解决你的问题,请参考以下文章

存储过程中的光标完成并卡住(Oracle Linux VM 上的 Oracle 11g)

Oracle 存储过程 - 也许 10g 和 11g 之间的区别?

ORACLE ADF11g:存储过程传入数据库对象

ORACLE ADF11g: AM 代码返回存储过程数据库对象数组

ORACLE ADF11g:AM 存储过程传入数据库对象数组

如何创建 Oracle 存储过程来锁定超过 90 天未登录数据库的用户帐户