powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
5 сообщений из 5, страница 1 из 1
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
    #40030148
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Загружаю в Oracle 19 библиотеку из SQLCl
Код: plsql
1.
loadjava -u login/pass@pdb1 $ORACLE_HOME/sqlcl/lib/dbtools-common.jar



(пробовал библиотеку и из SqlCL 20.2 и 20.3)

Создаю простой код для вызова oracle.dbtools.app.Format.format():
Formatter
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
create or replace and compile java source named Formatter as

import oracle.dbtools.app.Format;

public class Formatter
{
  public static String format (String str) {
    String res;
    try {
       oracle.dbtools.app.Format f = new oracle.dbtools.app.Format();
       //f.setDefaultOptions(); судя по коду Format он сам вызывает setDefaultOptions() при инициализации
       res = f.format(str);
       }
    catch (Exception e){
       res = e.getMessage();
    }
    return res;
  }
}
/
create or replace package Formatter is

  function format(pCommand varchar2)
    return varchar2
    IS LANGUAGE JAVA
    name 'Formatter.format(java.lang.String) return java.lang.String';

end Formatter;
/


Все прекрасно создается, но почему-то в отформатированных SQL нет переводов строк, которые по умолчанию в самом SqlCL есть:
Код: plsql
1.
2.
3.
4.
5.
SQL> select Formatter.format('select a,b,c,d,e,123 z from dual cross apply dual d2') xx from dual;

XX
-----------------------------------------------------------------------------------------------
SELECT A , B , C , D , E , 123 Z FROM DUAL CROSS APPLY DUAL D2


SqlCL format buffer
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select a,b,c,d,e,123 z from dual cross apply dual d2
  2  .

SQL> format buffer
  1  SELECT
  2      a,
  3      b,
  4      c,
  5      d,
  6      e,
  7      123 z
  8  FROM
  9*     dual CROSS APPLY dual d2



Есть у кого-нибудь идеи что тут может быть не так и как это пофиксить?

расширенная версия, где можно высвоить свои опции по дефолту
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
CREATE or replace AND COMPILE JAVA SOURCE NAMED SQLFormatter AS
/* Imports */
import oracle.dbtools.app.Format;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.sql.BLOB;
import oracle.sql.CLOB;
import java.io.StringWriter;
import java.io.PrintWriter;


public class SQLFormatter {

    private static String getStackTrace(Exception e) {
       StringWriter writer = new StringWriter();
       PrintWriter printWriter = new PrintWriter( writer );
       e.printStackTrace( printWriter );
       printWriter.flush();

       return writer.toString();
    }

    public static Format getFormat() {
        oracle.dbtools.app.Format format = new oracle.dbtools.app.Format();
        
        format.options.put("singleLineComments", Format.InlineComments.CommentsUnchanged);
        format.options.put("kwCase", Format.Case.UPPER);
        format.options.put("idCase", Format.Case.NoCaseChange); // default: Format.Case.lower
        format.options.put("adjustCaseOnly", false);            // default: false (set true to skip formatting)
        format.options.put("formatThreshold", 0);               // default: 1 (disables deprecated post-processing logic)
        // Alignment
        format.options.put("alignTabColAliases", false);        // default: true
        format.options.put("alignTypeDecl", true);
        format.options.put("alignNamedArgs", true);
        format.options.put("alignEquality", false);
        format.options.put("alignAssignments", true);           // default: false
        format.options.put("alignRight", true);                 // default: false
        // Indentation
        format.options.put("identSpaces", 4);
        format.options.put("useTab", false);
        // Line Breaks
        format.options.put("breaksComma", Format.Breaks.Before); // default: Format.Breaks.After
        format.options.put("breaksProcArgs", false);
        format.options.put("breaksConcat", Format.Breaks.Before);
        format.options.put("breaksAroundLogicalConjunctions", Format.Breaks.Before);
        format.options.put("breaksAfterSelect", true);          // default: true
        format.options.put("commasPerLine", 1);                 // default: 5
        format.options.put("breakOnSubqueries", true);
        format.options.put("breakAnsiiJoin", true);             // default: false
        format.options.put("breakParenCondition", true);        // default: false
        format.options.put("maxCharLineSize", 120);             // default: 128
        format.options.put("forceLinebreaksBeforeComment", false); // default: false
        format.options.put("extraLinesAfterSignificantStatements", Format.BreaksX2.Keep); // default: Format.BreaksX2.X2
        format.options.put("flowControl", Format.FlowControl.IndentedActions);
        // White Space
        format.options.put("spaceAroundOperators", true);
        format.options.put("spaceAfterCommas", true);
        format.options.put("spaceAroundBrackets", Format.Space.Default);
        //format.options.put("formatProgramURL", "default");
        
        return format;
    }
    
  public static String format(String str) 
  {
    String res;
    try {
       //Format f = SQLFormatter.getFormat();
       //res = f.format(str);
       //res = res.replaceAll("\n",";");
       res = new Format().format(str);
       }
    catch (Exception e){
       res = "Error: " + e.getMessage() + " [ " + SQLFormatter.getStackTrace(e) + " ]";
    }
    return res;
  }

  public static CLOB formatClob(oracle.sql.CLOB clob) 
  throws SQLException
  {
    String str = clob.getSubString(1, (int) clob.length());
    String res = SQLFormatter.format(str);
    Connection conn = DriverManager.getConnection("jdbc:default:connection:");
    CLOB resClob = CLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);
    resClob.setString(1L, res);
    
    return resClob;
  }
}
/
CREATE or replace FUNCTION SQLFormat(str in varchar2) RETURN VARCHAR2
AS LANGUAGE JAVA NAME 'SQLFormatter.format(java.lang.String) return java.lang.String';
/
CREATE or replace FUNCTION SQLFormatClob(str in clob) RETURN CLOB
AS LANGUAGE JAVA NAME 'SQLFormatter.formatClob(oracle.sql.CLOB) return oracle.sql.CLOB';
/

Та же хрень:
Код: plsql
1.
2.
3.
4.
select SQLFormat('select a,b,c,d,e,123 z from dual cross apply dual d2') xx from dual;
XX
--------------------------------------------------------------------------------------
SELECT A , B , C , D , E , 123 Z FROM DUAL CROSS APPLY DUAL D2



1n c0d3 ǝʍ ʇsnɹʇ!
...
Рейтинг: 0 / 0
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
    #40030167
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Саян, а dump от этого вызова что даёт?
...
Рейтинг: 0 / 0
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
    #40030171
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,

к сожалению, ничего интересного - пробелы, а не потерянные символы. В расширенной версии можешь увидеть как я даже пытался replaceAll делать, но увы, тупо нет переводов строк
...
Рейтинг: 0 / 0
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
    #40030174
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если что, вот декомпилированный oracle.dbtools.app.Format.class: https://gist.github.com/xtender/5e03a856b56dd8f0b109889f88b1c887
...
Рейтинг: 0 / 0
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
    #40030218
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
спасибо SeaGate, последние две команды все исправили:
Код: plsql
1.
2.
3.
exec dbms_java.grant_permission( 'XTENDER', 'SYS:java.lang.RuntimePermission', 'oracle.DbmsJavaScriptUser', '' );
exec dbms_java.grant_permission( 'XTENDER', 'SYS:java.lang.RuntimePermission', 'accessClassInPackage.jdk.nashorn.internal.runtime', '' );
exec dbms_java.grant_permission( 'XTENDER', 'SYS:java.lang.reflect.ReflectPermission', 'suppressAccessChecks', '' );


первую я выполнял(выдавало сразу ошибку прав с командой фикса), но забыл тут отписаться
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]