Oracle程序,当我需要在列中创建多个结果时如何创建

tyky79it  于 2023-04-05  发布在  Oracle
关注(0)|答案(2)|浏览(153)

我需要帮助在Oracle中创建过程,如SELECT语句:

CREATE TABLE test_schema.test_table
     (
      test1_col INTEGER,
      test2_col VARCHAR2(7)
      )
;

INSERT INTO test_schema.test_table VALUES (1,'TEST1');
INSERT INTO test_schema.test_table VALUES (1,'TEST1_1');
INSERT INTO test_schema.test_table VALUES (2,'TEST2');
INSERT INTO test_schema.test_table VALUES (2,'TEST2_2');
INSERT INTO test_schema.test_table VALUES (3,'TEST3');
INSERT INTO test_schema.test_table VALUES (3,'TEST3_3');

CREATE OR REPLACE PROCEDURE test_schema.test_name_procedure
(
  var_in_test IN VARCHAR
, var_out_test1 OUT NUMBER
, var_out_test2 OUT VARCHAR
) AS
BEGIN
SELECT
   test1_col
   test2_col
 INTO   
   var_out_test1
   ,var_out_test2
 FROM test_schema.test_table
WHERE test1_col = var_in_test;

END;

当我执行过程时:
我得到信息:
SQL错误[900] [42000]:ORA-00900:无效的SQL语句
错误:900,位置:0,Sql = EXECUTE test_schema.test_name_procedure(2),OriginalSql = EXECUTE test_schema.test_name_procedure(2),错误消息= ORA-00900:无效SQL语句
ORA-00900:无效的SQL语句
我需要在单独的一栏中列出结果。
当我尝试从开始和结束执行过程时,我得到信息:

BEGIN
 test_schema.test_name_procedure(2);
END;

SQL错误[6550] [65000]:ORA-06550:第2行,第14列:

zaq34kh6

zaq34kh61#

忘记“test1_col”第一列后的“,”,请检查此部分

SELECT
   *test1_col*
   test2_col
 INTO

另外你调用的程序不正确,需要添加变量来输出参数:

DECLARE 
var_in_test VARCHAR(1000) := '2';
var_out_test1 NUMBER;
var_out_test2 VARCHAR(1000);
BEGIN 
 stack_test_name_procedure(2, var_out_test1, var_out_test2);
END;

此请求返回异常TOO_MANY_ROWS,处理该异常

rseugnpd

rseugnpd2#

这里有很多问题。让我们从这样的样本数据开始:

Select * from tbl;
      COL1 COL2   
---------- -------
         1 TEST1  
         1 TEST1_1
         2 TEST2  
         2 TEST2_2
         3 TEST3  
         3 TEST3_3

您的程序的更正代码可能是:

Create or replace PROCEDURE test_p(p_var_in IN VARCHAR, p_var1_out OUT NUMBER, p_var2_out OUT VARCHAR2) IS
BEGIN
    SELECT  COL1, COL2
    INTO    p_var1_out, p_var2_out
    FROM    tbl
    WHERE   COL1 = p_var_in And ROWNUM = 1;
END test_p;

在WHERE子句中添加ROWNUM = 1,以确保仅检索1行。提供示例数据,如果没有附加条件(添加您自己的条件),它将以错误结束,因为您无法在单个变量中存储多行结果(如果是这种情况,请考虑使用游标)。
接下来,如何调用该过程:

SET SERVEROUTPUT ON
Declare
    v1    tbl.COL1%TYPE;
    v2    tbl.COL2%TYPE;
Begin
    test_p(2, v1, v2);
    DBMS_OUTPUT.PUT_LINE('COL1 = ' || v1 || '    |    COL2 = ' || v2);
End;
/

--  Result:
COL1 = 2    |    COL2 = TEST2

正如你提到的单独的列,也许你需要一个函数而不是一个过程-一个选项可以像这样:

Create or replace FUNCTION test_f(p_var_in IN VARCHAR, p_what IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
    Declare
        var1    NUMBER;
        var2    VARCHAR2(20);
    Begin
        SELECT  COL1, COL2
        INTO    var1, var2
        FROM    tbl
        WHERE   COL1 = p_var_in And ROWNUM = 1;
        RETURN CASE p_WHAT WHEN 'COL1' THEN To_Char(var1) WHEN 'COL2' THEN var2 END;
    End;
END test_f;

注意:上面的函数返回两列的VarChar 2数据类型……

--  Calling function from a query:
Select To_Number(test_f(2, 'COL1')) "COL1", test_f(2, 'COL2') "COL2" From Dual;

--  Result:
COL1  COL2
----  ------
   2  TEST2

相关问题