【问题标题】:Problems with characters executing a sentence SQL from JAVA从 JAVA 执行语句 SQL 的字符问题
【发布时间】:2014-10-24 13:30:27
【问题描述】:

我已将此字符串存储在 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中动态创建一个存储过程。

我正在使用休眠,在执行语句之前,我将字符 ':' 替换为 '\:',现在我有了这个代码:

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();

使用我从数据库中恢复的字符串,我在 q=session.createSQLQuery(sourceCode); 中获得错误

org.hibernate.QueryException: Space is not allowed after parameter prefix ':'

但如果我直接执行的句子有效,为什么?我认为这可能是一些隐藏字符,因为如果我使用 '==' 进行比较,结果是错误的,但我看不到这些字符。

谢谢 :)

【问题讨论】:

  • 尝试替换“s_aviso := '0.- New test plan.';”用“选择'0.-新的测试计划。'从对偶进入 s_aviso;"
  • 我使用的是 Hibernate 4.2.7。问题不在于 s_aviso var。我在程序中有更多的 ':=' 可以用这种方式替换。

标签: java oracle hibernate plsql special-characters


【解决方案1】:

从错误来看,似乎 : 导致了一个问题,即使它使用 \ 进行了转义。

您使用的是哪个版本的休眠?看看https://stackoverflow.com/a/11709475/883679 看看这是不是你的问题

【讨论】:

  • 我使用的是 Hibernate 4.2.7。如果我从数据中读取文本,它不起作用,但如果我复制并粘贴文本并直接放入 java 代码中,它会起作用。两个文本都有字符 '\\:=' q=session.createSQLQuery(sourceCode);
  • session.createSQLQuery(sourceCode); - 这里只使用 1 '\'
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2014-01-12
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2020-09-07
相关资源
最近更新 更多