字符从JAVA执行SQL语句时出现问题

字符从JAVA执行SQL语句时出现问题,java,oracle,hibernate,plsql,special-characters,Java,Oracle,Hibernate,Plsql,Special Characters,我在oracle数据库的表中存储了以下字符串: CREATE OR replace PROCEDURE P_algorithm_ptcrb_2 ( s_result IN OUT VARCHAR2, i_config IN NUMBER, i_user IN NUMBER, s_name IN VARCHAR2, i_general_features IN NUMBER, i_pic

我在oracle数据库的表中存储了以下字符串:

CREATE OR replace PROCEDURE P_algorithm_ptcrb_2 ( 
s_result           IN OUT VARCHAR2, 
i_config           IN NUMBER, 
i_user             IN NUMBER, 
s_name             IN VARCHAR2, 
i_general_features IN NUMBER, 
i_pic              IN NUMBER) 
AS 
  s_aviso                VARCHAR2(2000); 
  /*TYPE array_varchar2 IS TABLE OF VARCHAR2(2) INDEX BY BINARY_INTEGER;*/ 
  l_categories           pkg_ptcrb.array_varchar2; 
  l_bands                pkg_ptcrb.array_varchar64; 
  l_test_requirements    VARCHAR2(256); 
  l_technologies         VARCHAR2(256); 
  i_test_plan_generation NUMBER; 
  i_error_pic            NUMBER; 
BEGIN /* Hora de inicio */ 
    SELECT 'Start_ ' 
           || To_char(SYSDATE, 'HH24_MI_SS') 
    INTO   s_aviso 
    FROM   dual; 

    dbms_output.Put_line(s_aviso); /* ********************* */ 
    /* STEP 0_ New test plan */ /* 
                                ********************* */ 

    s_aviso := '0.- New test plan.'; 
EXCEPTION 
  WHEN OTHERS THEN 
             Raise_application_error(-20001, 'An error was encountered - ' 
                                             ||SQLCODE 
                                             ||' -ERROR- ' 
                                             ||SQLERRM); 
END p_algorithm_ptcrb_2; 
我需要从java应用程序中执行这句话,以便在oracle中动态创建存储过程

我正在使用hibernate,在执行句子之前,我将字符“:”替换为“\:”,现在我有了以下代码:

CREATE OR replace PROCEDURE P_algorithm_ptcrb_2 ( s_result          IN OUT VARCHAR2, 
                                                 i_config           IN NUMBER, 
                                                 i_user             IN NUMBER, 
                                                 s_name             IN VARCHAR2, 
                                                 i_general_features IN NUMBER, 
                                                 i_pic              IN NUMBER ) AS s_aviso VARCHAR2(2000);
  /*TYPE array_varchar2 IS TABLE OF VARCHAR2(2) INDEX BY BINARY_INTEGER;*/ 
  l_categories pkg_ptcrb.array_varchar2; 
  l_bands pkg_ptcrb.array_varchar64; 
  l_test_requirements    VARCHAR2(256); 
  l_technologies         VARCHAR2(256); 
  i_test_plan_generation NUMBER; 
  i_error_pic            NUMBER; 
  BEGIN 
    /* Hora de inicio */ 
    SELECT 'Start_ ' 
                  || To_char(SYSDATE, 'HH24_MI_SS') 
    INTO   s_aviso 
    FROM   dual; 

    dbms_output.Put_line(s_aviso); 
    /* ********************* */ 
    /* STEP 0_ New test plan */ 
    /* 
********************* */ 
    s_aviso \\:= '0.- New test plan.'; 
  EXCEPTION 
  WHEN OTHERS THEN 
    Raise_application_error(-20001,'An error was encountered - ' 
    ||SQLCODE 
    ||' -ERROR- ' 
    ||SQLERRM); 
  END p_algorithm_ptcrb_2;
代码中唯一的区别是字符“:”和“\:”

现在我执行java代码:

Query q= session.createSQLQuery("create or replace PROCEDURE P_ALGORITHM_PTCRB_2 ( s_result in out VARCHAR2, i_config in NUMBER, i_user in NUMBER, s_name in VARCHAR2, i_general_features in NUMBER, i_pic in NUMBER ) AS   s_aviso VARCHAR2(2000); /*TYPE array_varchar2 IS TABLE OF VARCHAR2(2) INDEX BY BINARY_INTEGER;*/ l_categories PKG_PTCRB.array_varchar2; l_bands PKG_PTCRB.array_varchar64; l_test_requirements VARCHAR2(256); l_technologies VARCHAR2(256); i_test_plan_generation NUMBER; i_error_pic NUMBER; BEGIN /* Hora de inicio */ select 'Start_ '|| to_char(sysdate, 'HH24_MI_SS') into s_aviso from dual; dbms_output.put_line(s_aviso); /* ********************* */ /* STEP 0_ New test plan */ /* ********************* */ s_aviso \\:= '0.- New test plan.'; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); END P_ALGORITHM_PTCRB_2;");

      String aux="create or replace PROCEDURE P_ALGORITHM_PTCRB_2 ( s_result in out VARCHAR2, i_config in NUMBER, i_user in NUMBER, s_name in VARCHAR2, i_general_features in NUMBER, i_pic in NUMBER ) AS   s_aviso VARCHAR2(2000); /*TYPE array_varchar2 IS TABLE OF VARCHAR2(2) INDEX BY BINARY_INTEGER;*/ l_categories PKG_PTCRB.array_varchar2; l_bands PKG_PTCRB.array_varchar64; l_test_requirements VARCHAR2(256); l_technologies VARCHAR2(256); i_test_plan_generation NUMBER; i_error_pic NUMBER; BEGIN /* Hora de inicio */ select 'Start_ '|| to_char(sysdate, 'HH24_MI_SS') into s_aviso from dual; dbms_output.put_line(s_aviso); /* ********************* */ /* STEP 0_ New test plan */ /* ********************* */ s_aviso \\:= '0.- New test plan.'; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); END P_ALGORITHM_PTCRB_2;";

      new String(aux).equals(sourceCode); // <--false

      boolean isEquals=aux == sourceCode; // <--false
      log.debug(aux);
      log.debug(sourceCode);
      q= session.createSQLQuery(aux);
      q=session.createSQLQuery(sourceCode);
      q.executeUpdate();
但是如果我直接执行的句子有效,为什么??我认为这可能是一些隐藏字符,因为如果我使用“==”进行比较,结果是错误的,但我没有看到这些字符


Thx:)

从错误中可以看出:导致了一个问题,尽管它用\转义


您使用的是什么版本的hibernate?看看这是否是您的问题

尝试将“s_-aviso:='0.-新测试计划';”替换为“选择'0.-新测试计划。.”从dual中插入s_-aviso;“我正在使用Hibernate 4.2.7。问题不在于s_aviso变量。我在过程中有更多的“:=”可以用这种方式替换。我使用的是Hibernate 4.2.7。如果我从datase中读取文本,它就不起作用,但是如果我复制并粘贴文本并将其直接放入java代码中,它就起作用了。两个文本都有字符“\\:=”q=session.createSQLQuery(源代码);会话。createSQLQuery(源代码);-这里只使用1'\'
org.hibernate.QueryException: Space is not allowed after parameter prefix ':'