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: AM 代码返回存储过程数据库对象数组