小编Pau*_*per的帖子

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

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

作为Oracle PL/SQL函数的结果,我想从现有表中返回单个记录.我已经找到了一些不同的方法,但我对最好的方法感兴趣(阅读:我对我发现的东西并不满意).

我正在做的是这个...我有一个名为'users'的表,我想要一个函数'update_and_get_user',它给出一个UserName(以及关于所述用户的其他可信信息)将可能执行各种操作'users'表,然后从所述表返回零行或一行/记录.

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

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;
Run Code Online (Sandbox Code Playgroud)

我已经看到了返回记录或表的示例,事先已创建/声明的记录或表的类型,但似乎如果表已经定义,我应该能够利用它,因此没有如果进行了表更改,则担心同步类型声明代码.

我对所有可能的解决方案和评论持开放态度,但我确实希望将其保留在单个PL/SQL函数中(与其他一些与数据库进行多次通信的语言/框架中的代码相反,完成某种形式的'SELECT*FROM users WHERE username = blah')作为调用函数的系统,数据库本身可能是不同的城市.超出这个限制,我愿意改变我的想法.

oracle plsql

7
推荐指数
1
解决办法
3万
查看次数

如何删除Teradata表中不在另一个表中的行?

让我的情况变得棘手的是我没有一个列密钥,只有一个简单的主键列表要删除(例如,"从表中删除键入([list])").我有多个列作为主键,并且需要加入所有列.

使用我所知道的其他数据库,我认为可以这样做:

DELETE FROM
    table1 t1
  LEFT OUTER JOIN
      table2 t2
    ON
      t2.key1 = t1.key1 AND
      t2.key2 = t1.key2
  WHERE
    t2.key1 IS NULL;
Run Code Online (Sandbox Code Playgroud)

但Teradata(v12)以错误号3706响应,说"语法错误:FROM子句中不允许加入表".

sql teradata

4
推荐指数
1
解决办法
3万
查看次数

标签 统计

oracle ×1

plsql ×1

sql ×1

teradata ×1