JSON String to CLOB объект - PullRequest
       64

JSON String to CLOB объект

0 голосов
/ 20 февраля 2019

Я создаю новый dbms_job, используя java-код, задание успешно создается, но при обработке не удается вызвать job_action.в job_action я вызываю процедуру для вызова загруженного оракулом Java-кода.Clob состоит из строки JSON.Кажется, формат json вызывает проблему в объекте oracle.sql.Clob.

Я не уверен, есть ли какие-либо проблемы с json, чтобы переместиться в json.почему это терпит неудачу здесь?

код Java:

connection = DBBroker.getConnection();
            stmt = (CallableStatement) connection.prepareCall("begin ? := PKGRESTASSIGNBLOCK.CREATEJOB(?, ?, ?); end;");

            CLOB clob = null;
            clob = CLOB.createTemporary(connection, false, CLOB.MODE_READWRITE);

            clob.open(CLOB.MODE_READWRITE);
            clob.setString(1, requestString);

            stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            stmt.setClob(2, clob);
            stmt.setString(3, requestID);
            stmt.setInt(4, requestType);
            stmt.execute();

процедура оракула:

CREATE OR REPLACE
PACKAGE BODY      PKGRESTASSIGNBLOCK
AS



FUNCTION createjob(request IN CLOB, requestID IN VARCHAR2, type IN NUMBER) RETURN VARCHAR2
IS
                    l_jobname  varchar2(1044);
BEGIN
      BEGIN
      l_jobname := NULL;

      l_jobname := SUBSTR('JOB_IPBlk_' || requestID ||'_'|| to_char(SYSTIMESTAMP, 'yymmddhhmmssFF'), 0, 30);
      DBMS_SCHEDULER.create_job(
                                job_name => l_jobname,
                                job_type => 'PLSQL_BLOCK',
                                job_action => 'begin pkgrestassignblock.assignblock ('|| request || ', ' || requestID || ', '|| type||'); end ;',
                                start_date => SYSTIMESTAMP,
                                repeat_interval      => NULL,
                                end_date             => NULL,
                                enabled              => TRUE,
                                comments             => 'Job defined entirely by the CREATE JOB procedure.');

      END;
      DBMS_OUTPUT.put_line ('l_jobname : ' ||l_jobname);
      RETURN l_jobname;
END createjob;



PROCEDURE assignblock (request IN CLOB, requestID IN VARCHAR2, type IN NUMBER)
AS
LANGUAGE JAVA
NAME 'com.abcd.efgh.AssignBlock.handleRequest(java.sql.Clob, java.lang.String, java.lang.String, int)';



END PKGRESTASSIGNBLOCK;

журналы оракула:

logs

ORA-12012: error on auto execute of job "JOB_BLK_20022019_19022008020"
ORA-06550: line 1, column 799:
PLS-00103: Encountered the symbol "{" when expecting one of the following:

   ( ) - + case mod new not null <an identifier>
   <a double-quoted delimited-identifier> <a bind variable>
   table continue avg count current exists max min prior sql
   stddev sum variance execute multiset the both leading
   trailing forall merge year month day hour minute second
   timezone_hour timezone_minute timezone_region timezone_abbr
   time timestamp interval date
   <a string literal with character set specification>
Wed Feb 20 20:55:03 2019
Errors in file path/trace/CMM_j002_30847.trc:
ORA-12012: error on auto execute of job ""JOB_BLK_20022019_19022008020"
ORA-06550: line 1, column 756:
PLS-00306: wrong number or types of arguments in call to 'ASSIGNBLOCK'
ORA-06550: line 1, column 756:
PL/SQL: Statement ignored

1 Ответ

0 голосов
/ 20 февраля 2019

Ну, я думаю, вы можете столкнуться с проблемой, поскольку job_action - это VARCHAR2.Я не уверен, что он ограничен 4000 или 32767 символами, но в любом случае, если ваш JSON длинный, он может сломать это.

Однако ваша главная проблема в том, что вы не цитируете свои строки.Попробуйте изменить эту строку:

job_action => 'pkgrestassignblock.assignblock('''|| request || ''', ''' || requestID || ''', '|| type||');',

Я также удалил begin..end;, поскольку в любом случае задание переносит действие в свой собственный блок начала / конца.

...