我有这样的SP
create or replace PROCEDURE myproc
myvar in out mytable.mycol%TYPE
Run Code Online (Sandbox Code Playgroud)
mycol是char的地方(1个字节)
从java代码,我尝试将一个字符串/字符绑定到此变量,我得到
ORA-01461 - 只能将LONG值绑定到LONG列中
如果我替换
myvar in out varchar2
Run Code Online (Sandbox Code Playgroud)
然后它工作
关于如何正确绑定Java代码中的值的任何想法?
我真的想继续使用%type来存储过程输入参数
PS.这不是ORA-01461的重复:只能插入LONG列的LONG值 - 查询时发生,因为它引用了char(1)列
UPDATE
添加更多信息
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import oracle.jdbc.pool.OracleDataSource;
public class SimpleDbStandalonePureJdbcTest {
public static void main(String[] args) throws SQLException {
OracleDataSource ods = new OracleDataSource();
ods.setUser("xxx");
ods.setPassword("xxx");
ods.setServerName("xxx");
ods.setPortNumber(xxx);
ods.setDriverType("thin");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("xxx");
Connection conn = ods.getConnection();
CallableStatement sp = conn.prepareCall("{call testleosp(?)} ");
Clob clob …Run Code Online (Sandbox Code Playgroud) 警告 - 原因不是缺少文件 - 所有线程都在呼叫相同的脚本文件
我开始5-6个线程,在Red Hat框中调用本地脚本.
我注意到有时,我收到以下错误消息
couldn't read file "/home/leo/myScript.exp": no such file or directory
Run Code Online (Sandbox Code Playgroud)
显然,所有进程都在执行脚本,因此它似乎与[1]操作系统有关,对可以运行脚本或访问文件进行读取的同时进程有一些限制,或者[2] Java正在尝试执行某些操作一些未准备好的流(我假设commons-exec会为我处理这个)
这是代码
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CommandLine commandline = CommandLine.parse("/home/leo/myScript.exp");
DefaultExecutor exec = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
exec.setStreamHandler(streamHandler);
try {
exec.execute(commandline); <<< error happens here
}catch(IOException io) {
throw new Exception("");
}
Run Code Online (Sandbox Code Playgroud)
如果错误是[1],那么我想知道如何在linux OS中放宽这个限制
如果错误是[2],那么我想知道如何告诉commons-exec等待资源准备好(在最坏的情况下我只是添加一些重试,但我认为这不是很优雅)
如果错误是别的,至少知道原因将足以让我找到一些解决方案.
更新 - 3月15日
嗯,这就是事情.
该脚本是一个期望脚本,它使用库来调用Java类.
我注意到的一件事是脚本运行良好,直到它调用一个创建数据库连接的java方法.
因为线程数量很少(3~5)我不认为这是数据库中的问题.相反,在我看来,在调用java代码时和/或在java代码创建数据库连接时阻止调用脚本.
我仍然试图得到确切的异常,但是期望脚本看起来像这样(有点)
#!/opt/tclblend/bin/expect -f
set edfDir "/usr/local/nssa/bin/edf";
set env(LD_LIBRARY_PATH) "/opt/tclblend/lib/tcljava1.4.1"; # for tclBlend
## always use …Run Code Online (Sandbox Code Playgroud) 我一直认为@PersistenceContext用于将EntityManager注入到容器管理的应用程序中,而@PersistenceUnit用于注入EntityManagerFactory。
Javadoc 说
对于 PersistenceUnit ( http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceUnit.html )
表达对 EntityManagerFactory 及其关联的持久性单元的依赖关系。
对于PersistenceContext(http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceContext.html)
表达对容器管理的 EntityManager 及其关联的持久性上下文的依赖关系。
到目前为止一切顺利,但后来我正在阅读 JPA 教程(请参阅https://docs.oracle.com/cd/E19798-01/821-1841/bnbqy/index.html),其中包含这样的示例
以下示例显示如何在使用应用程序管理的实体管理器的应用程序中管理事务:
@PersistenceContext
EntityManagerFactory emf;
EntityManager em;
@Resource
UserTransaction utx;
...
em = emf.createEntityManager();
try {
utx.begin();
em.persist(SomeEntity);
em.merge(AnotherEntity);
em.remove(ThirdEntity);
utx.commit();
} catch (Exception e) {
utx.rollback();
}
Run Code Online (Sandbox Code Playgroud)
那么如果我们谈论应用程序托管代码,PersistenceContext 也可以引用 EntityManagerFactory 吗?
免责声明——我猜与这个问题的答案无关——PersistenceUnit vs PersistenceContext