当前位置: 首页 > 知识库问答 >
问题:

返回数据的Oracle Java存储过程

宗政文彬
2023-03-14

我正在尝试编写一个可以返回结果的Java存储过程。我在Oracle网站上找到了这个文档,但是没有一个示例提供返回数据http://docs.oracle.com/cd/B19306_01/java.102/b14187/cheight.htm#CHDJJDGH

我创建了如下软件包:

CREATE OR REPLACE PACKAGE test_proc AS 
FUNCTION hello_world RETURN VARCHAR2;
PROCEDURE insert_test(CHAINE VARCHAR2, NOMBRE NUMBER);
END test_proc;

包体如下

CREATE OR REPLACE PACKAGE BODY test_proc AS
FUNCTION hello_world RETURN VARCHAR2 AS LANGUAGE JAVA
NAME 'TestProc.helloWorld() return java.lang.String';
PROCEDURE insert_test(CHAINE VARCHAR2, NOMBRE NUMBER) AS LANGUAGE JAVA
NAME 'TestProc.insertTEST(java.lang.String, int)';
END test_proc;

和 Java 代码

public class TestProc {

public static void insertTEST(String chaine, int nombre) 
{
    System.out.println("Insert into test...");
    String sql = "INSERT INTO TEST VALUES(?,?)";
    try
    {
        Connection conn = DriverManager.getConnection("jdbc:default:connection:");
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, chaine);
        pstmt.setInt(2, nombre);
        pstmt.executeUpdate();
    }
    catch (SQLException e)
    {
        System.err.println(e.getMessage());     
    }
}

public static String helloWorld() 
{
    return "Hello world!!";
 }
}

我使用SQLDeveloper通过以下指令调用我的过程

CALL test_proc.insert_test('test',1); #work
CALL test_proc.hello_world(); #doesn't work

执行第二条指令时,我有以下错误ORA-06576:不是有效的函数或过程名称

你知道如何解决这个问题吗?或者你知道在哪里可以找到java存储过程在Oracle数据库中返回数据的工作示例吗?

最后使用以下命令得到结果:

select test_proc.hello_world() from dual;

结果:

TEST_PROC.HELLO_WORLD()                                                              
-------------------------------------------------------------------------------------
Hello World!!
1 rows selected

您知道如何从数据库中返回复杂的结果(如多行)吗?

共有1个答案

聂华翰
2023-03-14

对于返回某些内容的 PL/SQL 函数,不能在 PL/SQL 中调用它,就好像它是一个过程一样。将其称为函数。尝试

var test VARCHAR2(30)
CALL test_proc.hello_world() INTO :test;
print test

TEST
------------------------------------------
Hello world!!
 类似资料:
  • 问题内容: 如何计算存储过程将以最快的方式返回的行数。存储过程返回大约100K到1M记录的行。 问题答案: 选择: 执行存储过程后。

  • 我有一个存储过程,它接受参数并返回一个长值。 我如何使用jdbcTemplate来调用这个存储过程并获得返回的值。 这样对吗?

  • 问题内容: 我正在尝试从存储过程中获取返回值,但它始终返回0。 C#代码 SP 在所有情况下,它都返回0。我不知道问题所在。 问题答案: 我尝试了类似您的代码,并且可以按预期工作。 但是,您的代码中两次调用ExecuteNonQuery。 首次调用时,将按预期插入记录,然后为返回值添加参数并再次执行命令。但是现在记录已存在,并且存储过程始终落在else块中,因此始终返回零。

  • 问题内容: MySql存储过程/函数可以在不使用临时表的情况下返回表吗? 创建以下过程 然后用 显示示例表-正如预期的那样-但似乎无法进行以下操作: 是否可以从存储过程/函数中返回查询结果表,如果可以,怎么办? 问题答案: 就目前而言,这是不可能的。 以下是该子句中可能使用的 文档: 如您所见,存储过程不在此列表中。

  • 本文向大家介绍Sql Server 存储过程调用存储过程接收输出参数返回值,包括了Sql Server 存储过程调用存储过程接收输出参数返回值的使用技巧和注意事项,需要的朋友参考一下 创建存储过程: 接收输出参数: 2,带返回值 创建存储过程: 接收返回值: 以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 我有一个使用SimpleJDBCCall调用DB过程的DAO函数。但是,我无法读取存储过程返回的CLOB数据。当我尝试对返回的CLOB值(result.get(“out_rtn_xml”))执行.toString()时,我只在字符串中得到以下内容:oracle.sql.CLOB@f762282a 下面是代码片段。