gpt4 book ai didi

oracle - 如何从 Oracle PL/SQL 函数返回现有表中的记录?

转载 作者:行者123 更新时间:2023-12-02 11:30:31 24 4
gpt4 key购买 nike

我知道这似乎是一件基本的事情,但我以前从未这样做过。

我想从现有表中返回一条记录作为 Oracle PL/SQL 函数的结果。我已经找到了几种不同的方法来做到这一点,但我对最好的方法感兴趣(阅读:我对我所发现的并不是那么满意)。

我正在做的事情的要点是......我有一个名为“users”的表,我想要一个函数“update_and_get_user”,给定用户名(以及有关该用户的其他可信信息)可能会执行对“用户”表执行各种操作,然后从该表返回零或一条行/记录。

这是我目前脑海中代码的基本轮廓(阅读:不知道语法是否接近正确):

CREATE FUNCTION update_and_get_user(UserName in VARCHAR2, OtherStuff in VARCHAR2)
RETURN users PIPELINED IS
TYPE ref0 IS REF CURSOR;
cur0 ref0;
output_rec users%ROWTYPE;
BEGIN
-- Do stuff

-- Return the row (or nothing)
OPEN cur0 FOR 'SELECT * FROM users WHERE username = :1'
USING UserName;

LOOP
FETCH cur0 INTO output_rec;
EXIT WHEN cur0%NOTFOUND;
PIPE ROW(output_rec);
END LOOP;
END update_and_get_user;

我见过返回记录或表的示例,记录或表的类型已预先创建/声明,但似乎如果表已经定义,我应该能够利用它,并且因此,如果表发生更改,则不必担心同步类型声明代码。

我对所有潜在的解决方案和评论持开放态度,但我确实真的希望将其保留在单个 PL/SQL 函数中(而不是与其他语言/框架进行通信的代码)多次数据库,最后以某种形式的“SELECT * FROM users WHERE username=blah”)结束,因为调用该函数的系统和数据库本身可能位于不同的城市。超出这个限制,我愿意改变我的想法。

最佳答案

我就是这么做的。 Oracle 中的变量/表名/列名不区分大小写,因此我会使用 user_name 而不是 UserName

CREATE TABLE users( UserName varchar2(20), OtherStuff VARCHAR2(20) );

函数update_and_get_user。请注意,我返回的是 ROWTYPE 而不是流水线表。

CREATE OR REPLACE FUNCTION update_and_get_user(
in_UserName IN users.UserName%TYPE,
in_OtherStuff IN users.OtherStuff%TYPE )
RETURN users%ROWTYPE
IS
output_rec users%ROWTYPE;
BEGIN
UPDATE users
SET OtherStuff = in_OtherStuff
WHERE UserName = in_UserName
RETURNING UserName, OtherStuff
INTO output_rec;
RETURN output_rec;
END update_and_get_user;

这就是你所说的。您无法检查 ROWTYPE 是否为 NULL,但您可以检查 username 例如。

DECLARE
users_rec users%ROWTYPE;
BEGIN
users_rec := update_and_get_user('user', 'stuff');
IF( users_rec.username IS NOT NULL ) THEN
dbms_output.put_line('FOUND: ' || users_rec.otherstuff);
END IF;
END;
<小时/>

下面是使用PIPED ROWS的解决方案,但它并不能以这种方式工作。您无法更新查询内的表。

SELECT * FROM TABLE(update_and_get_user('user', 'stuff'))

ORA-14551: cannot perform a DML operation inside a query

解决方案如下所示:

CREATE OR REPLACE TYPE users_type
AS OBJECT
(
username VARCHAR2(20),
otherstuff VARCHAR2(20)
)

CREATE OR REPLACE TYPE users_tab
AS TABLE OF users_type;

CREATE OR REPLACE FUNCTION update_and_get_user(
in_UserName IN users.username%TYPE,
in_OtherStuff IN users.otherstuff%TYPE )
RETURN users_tab PIPELINED
IS
output_rec users%ROWTYPE;
BEGIN
UPDATE users
SET OtherStuff = in_OtherStuff
WHERE UserName = in_UserName
RETURNING username, otherstuff
INTO output_rec;
PIPE ROW(users_type(output_rec.username, output_rec.otherstuff));
END;

关于oracle - 如何从 Oracle PL/SQL 函数返回现有表中的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com