在Oracle DBMS中,性能更好,从另一个pl/sql存储过程调用java存储过程或从另一个pl/sql存储过程调用pl/sql存储过程.
顺便说一下,我的pl/sql过程中有一个循环,它会多次调用java过程(即我的代码在PL/SQL和Java存储过程之间翻转),这样会降低性能吗?
我在2008年发现了一篇文章,讨论如何从MySQL调用Java代码.有很多警告和免责声明,因为这个过程涉及使用MySQL的实验分支.
对于我想到的项目,能够访问MySQL中的Java库非常有用,类似于Oracle的Java存储过程.此功能现在是否作为MySQL的标准功能存在?如果没有,哪些开源RDBMS支持类似于Oracle的Java存储过程的东西?
我的问题可能有点令人困惑.我有一个问题,我正在用StoredProcedureCallJava 调用一个过程,例如:
StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("test");
call.addNamedArgument("p_year");
call.addNamedArgument("p_rel");
call.useNamedCursorOutputAsResultSet("p_resset");
Run Code Online (Sandbox Code Playgroud)
resset 是我的结果作为光标 - 正如你所看到的 - 当程序看起来像这样工作没有任何问题:
create or replace PROCEDURE TEST (p_year IN NUMBER,
p_rel IN VARCHAR2,
p_resset OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_resset FOR
SELECT NVL (s.KA, 'Summe') ka,
COUNT (s.AZ) az
FROM table1 s,
table2 w
WHERE s.year= w.year
AND w.relevant = p_rel
AND s.year = p_year
END;
Run Code Online (Sandbox Code Playgroud)
现在我添加了一个以"p_data"自己的select调用命名的输出参数
create or replace PROCEDURE TEST (p_year IN NUMBER,
p_rel IN VARCHAR2,
p_data OUT VARCHAR2, …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Oracle中的Java存储过程,并且在尝试在Java代码中获取连接时会看到一些奇怪的行为.
我的Java被打包成一个jar文件,然后使用loadjava命令行实用程序部署到Oracle中.package然后在数据库中创建A ,该数据库通过调用规范将指定Java类中的每个方法映射到PL/SQL函数.
我正在使用的一些专栏是CLOBs.在Java中,我尝试将其值CLOB(在调用规范中映射为oracle.sql.CLOB)提取到String:
private static String getStringFromCLOB(CLOB clob) throws SQLException {
long length = clob.length();
return clob.getSubString(1, (int) length);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我在SQL*Plus中显示以下堆栈跟踪:
java.lang.ArithmeticException: / by zero
at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107)
at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481)
at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505)
at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53)
at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177)
at oracle.sql.CLOB.getDBAccess(CLOB.java:1383)
at oracle.sql.CLOB.length(CLOB.java:197)
Run Code Online (Sandbox Code Playgroud)
在我刚刚看到这样的消息之前,我Exception用一个包装了违规方法的内容,try / catch所以我可以将完整的堆栈跟踪转储到System.out.
值得注意的是,我已经将其用于Oracle 11.2.0.1.0(32位),但它不适用于Oracle 11.2.0.2.0(64位).
我还有其他Java支持的PL/SQL function工作没有问题.只有尝试使连接失败的人才会这样做.
我已经看了一下<ORACLE_HOME>\jdbc\lib,虽然这两个发行版的名称相同,但这两个发行版似乎有所不同.目录中的jar(大小为11.2.0.1.0,显示大小为11.2.0.2.0):
ojdbc5.jar (1,950KB | 1,983KB)ojdbc5_g.jar (3,010KB …我正在实现一个存储过程,现在需要能够将jar文件包含到我的存储过程中,这些文件不属于JRE的标准部署.我怎样才能做到这一点?据我所知,Oracle 9不可能......
感谢帮助!
鉴于Oracle中的这个表
create table test (bytes raw(100), chset varchar2(50))
insert into test (bytes, chset) values (hextoraw('454647'), 'iso-8859-1')
Run Code Online (Sandbox Code Playgroud)
或者在MSSQL中
create table test (bytes varbinary(100), chset nvarchar(50))
insert into test (bytes, chset) values (0x454647, 'iso-8859-1')
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个全面的例子,说明如何使用Java的文本编码支持在Java中创建Oracle的UDF.
在MSSQL中我会创建这个.Net程序集:
using System.Text;
using Microsoft.SqlServer.Server;
namespace Whatever
{
public class Common
{
[SqlFunction]
public static string Decode(byte[] Bytes, string EncodingName)
{
return Encoding.GetEncoding(EncodingName).GetString(Bytes);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用这些命令注册程序集并定义udf:
create assembly MyAssembly from '...\MyAssembly.dll'
create function decode(@bytes varbinary(max), @chset nvarchar(100))
returns nvarchar(max) as external name MyAssembly.[Whatever.Common].Decode
Run Code Online (Sandbox Code Playgroud)
并在这样的查询中使用它:
> select …Run Code Online (Sandbox Code Playgroud) java sql oracle user-defined-functions java-stored-procedures
我在解决这个问题上非常接近,但我显然错过了一些东西.我的要求是从JDBC调用Oracle中的存储过程.存储过程将1个用户定义的Oracle对象作为INput,将另一个用户定义的Oracle对象作为OUTput.INput和OUTput对象混合了原始Oracle数据类型和另一组用户定义对象的集合.只要我为INput和OUTput对象中的集合类型设置NULL,我就能成功调用存储过程并返回结果.如果我尝试为Oracle对象列表创建ArrayDescriptor以将其发送到存储过程,我会不断遇到障碍.所以我需要帮助弄清楚如何将Array设置为INput对象并将其设置为CallableStatement.请注意,我知道如何将原始类型和数组作为直接输入发送到存储过程.但我不想这样做,因为我们以后必须向程序发送10个额外的字段,我不想将它们添加到方法签名中.这是课程列表.此外,下面的代码没有编译错误.
在oracle中打包:
CREATE OR REPLACE PACKAGE testPkg AS
PROCEDURE spGetTestData (
TESTDATA_IN IN TESTDATA_IN_OBJ,
TESTDATA_OUT OUT TESTDATA_OUT_OBJ
);
END;
Run Code Online (Sandbox Code Playgroud)
存储过程的输入对象:
CREATE OR REPLACE TYPE TESTDATA_IN_OBJ AS OBJECT(
testStr1 VARCHAR2(5),
arrObj1 ARR_OBJ_1_NT);
Run Code Online (Sandbox Code Playgroud)
Array对象作为INput对象的一部分:
create or replace TYPE ARR_OBJ_1_NT AS TABLE OF ARR_OBJ_1_OBJ;
Run Code Online (Sandbox Code Playgroud)
INput对象的UserDefined对象部分:
CREATE OR REPLACE TYPE ARR_OBJ_1_OBJ AS OBJECT
(
teststr VARCHAR2(14),
testNumber NUMBER(4),
);
Run Code Online (Sandbox Code Playgroud)
TestDataINObj.java:
import java.sql.Array;
import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;
public class TestDataINObj implements SQLData
{
private String sql_type = "TESTDATA_IN_OBJ"; …Run Code Online (Sandbox Code Playgroud) 这是我的程序代码.我试图通过在where子句中放置旧用户名来更新用户名.但它不起作用.
DELIMITER $$
DROP PROCEDURE IF EXISTS `databasename`.`UpdateUsername` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateUsername`
(IN uname VARCHAR(30),tid VARCHAR(100),username VARCHAR(30) )
BEGIN
UPDATE table_name SET Username=username WHERE Username=uname;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.
我有一个从多个表返回结果的存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetProjectAndClientOverview`()
BEGIN
SELECT ( SELECT count(*) FROM projects_info) as "projects_done",
(SELECT COUNT(*) FROM client_info) as "happy_clients",
(SELECT count(*) FROM projects_info where category_id in(
select id from pme.projects_category
where category_name in
("Commercial","Corporate","Hospitality")
)) as "real_professionals" ,
(SELECT COUNT(*) FROM client_info) as "cups_of_coffee";
END
Run Code Online (Sandbox Code Playgroud)
我必须使用 JPA 在 SpringBoot 中调用此过程,请指导如何为此存储过程创建实体类、存储库、服务。
我尝试创建实体类但不确定它是否正确
package com.panchmeru_studio.entities;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
@Data
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "getProjectAndClientOverview",
procedureName = "GetProjectAndClientOverview",
resultClasses ={ ProjectsInfo.class ,ClientInfo.class})
})
public class …Run Code Online (Sandbox Code Playgroud) jpa hibernate-mapping java-stored-procedures spring-boot-jpa
任何人都可以说存储过程的利弊和Java存储过程的优点和缺点?以及如何测试它.
最好的祝福!