Sql 使用返回多个值的函数更新多个列

Sql 使用返回多个值的函数更新多个列,sql,oracle,Sql,Oracle,我试图用函数的多个返回值更新一个表 我已经创建了一个类型 CREATE OR REPLACE TYPE city_state AS OBJECT ( city VARCHAR2(30), state VARCHAR2(2) ); / 我有一个函数,返回这种类型的变量 CREATE OR REPLACE FUNCTION closestcity(lat IN NUMBER, lon IN NUMBER) RETURN city_state IS ... 我需要更新一个包含城市、州、纬度

我试图用函数的多个返回值更新一个表

我已经创建了一个类型

CREATE OR REPLACE TYPE city_state AS OBJECT
(
  city VARCHAR2(30),
  state VARCHAR2(2)
);
/
我有一个函数,返回这种类型的变量

CREATE OR REPLACE FUNCTION closestcity(lat IN NUMBER, lon IN NUMBER) RETURN city_state IS
...
我需要更新一个包含城市、州、纬度和经度列的表。对于lat/lon,我应该调用函数并使用结果更新城市/州的值。我只想为每一行调用一次函数,并且只有一些行需要更新(假设city为NULL)

这就是我目前得到的

UPDATE (SELECT * FROM t t1 WHERE city IS NULL)
SET (city, state) = (
                     SELECT newcity.city, newcity.state FROM
                       ( SELECT closestcity(latitude, longitude) newcity
                         FROM t t2
                         WHERE t1.latitude = t2.latitude AND
                               t1.longitude = t2.longitude)
                    );
但我得到一个无效的标识符错误。我觉得我把它复杂化了,正确的方法是什么?

语法应该是:

UPDATE <table1>
set (<column1>, <column2>) = (select <column1>,<column2> 
                              from <table2> 
                              where <where clause table2 > )
where <where clause table1>
UPDATE t1
SET (city, state) = (SELECT closestcity(latitude, longitude) newcity
                            ,state
                       FROM t t2
                      WHERE t1.latitude = t2.latitude 
                        AND t1.longitude = t2.longitude)
where city IS NULL

出现该错误的原因是Oracle试图限定
SELECT newcity.city,newcity.state
SELECT语句中引用的
newcity
。它找不到对象
newcity
,因此抛出错误。如果确实需要,还可以将内联视图别名为
t1
。作为@Rene,您可以成功地将其替换为表名。为此,您可以按如下方式重写update语句:

UPDATE (SELECT * FROM t t1 WHERE city IS NULL) t1
   SET (city, state) = (
                         SELECT closestcity(latitude, longitude).city 
                              , closestcity(latitude, longitude).state
                           FROM t t2
                          WHERE t1.latitude = t2.latitude 
                            AND t1.longitude = t2.longitude 
                        );
或者简单地说:

UPDATE t t1 
   SET city  = closestcity(latitude, longitude).city 
     , state = closestcity(latitude, longitude).state
where t1.city is null
更新#1

update (select nd.newdata.city  as newcity
             , nd.newdata.state as newstate
             , city
             , state
          from (                             
                 SELECT closestcity(latitude, longitude) newdata
                      , city
                      , state
                   FROM t
                  where city is null
                ) nd
              ) q  
set q.city  = q.newcity
  , q.state = q.newstate 
只要一个变化

UPDATE (SELECT * FROM t WHERE city IS NULL) **t1**
SET (city, state) = (
                     SELECT newcity.city, newcity.state FROM
                       ( SELECT closestcity(latitude, longitude) newcity
                         FROM t t2
                         WHERE t1.latitude = t2.latitude AND
                               t1.longitude = t2.longitude)
                    );

我得到了
ORA-00904:“T1”。“经度”:无效标识符
这是可行的,但我最终调用了closestcity两次-这是一个非常重的函数State是newcity的一个变量(就像city一样),我无法直接选择它