Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle / 5 сообщений из 5, страница 1 из 1
22.12.2020, 14:25
    #40030148
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
Загружаю в 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
22.12.2020, 14:50
    #40030167
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
xtender,

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

к сожалению, ничего интересного - пробелы, а не потерянные символы. В расширенной версии можешь увидеть как я даже пытался replaceAll делать, но увы, тупо нет переводов строк
...
Рейтинг: 0 / 0
22.12.2020, 14:56
    #40030174
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
Если что, вот декомпилированный oracle.dbtools.app.Format.class: https://gist.github.com/xtender/5e03a856b56dd8f0b109889f88b1c887
...
Рейтинг: 0 / 0
22.12.2020, 15:56
    #40030218
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle
спасибо 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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странно работает oracle.dbtools.app.Format из SQLCl в самом Oracle / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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