如何使用Oracle数据库将多个列输出到变量中,以便以后在SQL文件中使用?

xzv2uavs  于 2023-06-29  发布在  Oracle
关注(0)|答案(1)|浏览(172)

我们正在尝试运行一个SQL脚本,它将为我们提供一些数据库信息,然后我们可以将这些信息放入下一部分。它将从我们的库存表中获取此查询的结果,然后查询服务器vi gv$services上的数据库,以确保正在运行的内容与我们的库存相匹配。然而,在继续之前,我们在获取想要开始的输出时遇到了问题。我们正在通过sqlplus在Oracle 19 c数据库上进行尝试。
我们尝试将此作为一个测试来分配变量vThisDB,例如:

BEGIN  

  FOR mydb in (
    SELECT DISTINCT db_name, hostname, service_name FROM inventory
  )                             
  LOOP
    mydb.db_name := vThisDB;
    DBMS_OUTPUT.PUT_LINE('current DB is: ' || vThisDB);
  END LOOP;

END;
/

我们得到的结果是这样的:
SQL> set serveroutput on size unlimited
SQL> @services.sql
当前DB为:
它是空白的,当我们想要的是:
当前DB为:TheDatabaseName(即上述查询的db_name列)
我们认为这与查询拉取3列的事实有关,这是插入下一部分所必需的。我们如何让所有3列同时工作,或者如何将查询结果输出到单独的变量中?谢谢你!

ajsxfq5m

ajsxfq5m1#

输出为空,因为您执行了相反的操作。
示例inventory表:

SQL> select * From inventory;

DB_N HOSTNAME  SERV
---- --------- ----
ORCL MY_SERVER ORCL

你的脚本,修正(添加了局部变量声明,缺少右括号和第7行,显示了你应该做的事情):

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    vThisDB inventory.db_name%type;
  3  BEGIN
  4    FOR mydb in (SELECT DISTINCT db_name, hostname, service_name FROM inventory)
  5    LOOP
  6      -- mydb.db_name := vThisDB;              --> not like this,
  7      vThisDB := mydb.db_name;                 --> but like this
  8      DBMS_OUTPUT.PUT_LINE('current DB is: ' || vThisDB);
  9    END LOOP;
 10  END;
 11  /
current DB is: ORCL             --> here's the output

PL/SQL procedure successfully completed.

SQL>

相关问题