Как создать хранимую функцию из Spring, используя JdbcTemplate? - PullRequest
4 голосов
/ 03 октября 2019

Для административных нужд мне нужно создать и заменить хранимые процедуры из репозитория Spring. Кто-нибудь уже сделал это?

Я пытался использовать следующий код (незаконченный):

@Component
public class JdbcRepository {
    @Autowired
    private JdbcTemplate jdbc;

    public void checkConn(){

        jdbc.execute("create or replace package Z$CLIENT_INTERFACE_API as \n" +
                "    function CL_ORG_SEARCH_CREATE(p_request in clob) return clob;\n" +
                "end Z$CLIENT_INTERFACE_API;\n" +
                "/\n" +
                "create or replace package body Z$CLIENT_INTERFACE_API as\n" +
                "    function CL_ORG_SEARCH_CREATE(p_request in clob) return clob\n" +
                "    is\n" +
                "        content_xml VARCHAR2(4000);\n" +
                "        p Dbms_Xmlparser.Parser;\n" +
                "        v_Doc Dbms_Xmldom.Domdocument;\n" +
                "        v_Root_Element Dbms_Xmldom.Domelement;\n" +
                "        v_Child_Nodes Dbms_Xmldom.Domnodelist;\n" +
                "        v_Child_Node Dbms_Xmldom.Domnode;\n" +
                "        v_Message_Id VARCHAR2(36);\n" +
                "        v_First_Char VARCHAR2(1);\n" +
                "    begin\n" +
                "        content_xml:=  CAST(p_request as VARCHAR2);\n" +
                "        p := Dbms_Xmlparser.Newparser;\n" +
                "        dbms_xmlparser.setvalidationmode(p,False);\n" +
                "        dbms_xmlparser.parsebuffer(p,content_xml);\n" +
                "        v_Doc := dbms_xmlparser.getdocument(p);\n" +
                "        v_Root_Element := Dbms_Xmldom.getdocumentelement(v_Doc);\n" +
                "        return 'aaaaaaaaaaaaaaaaaaaaaaaaaa1';\n" +
                "    end;\n" +
                "end Z$CLIENT_INTERFACE_API;\n" +
                "/");
    }

}

Но когда я его выполняю, я беру неработающий пакет в БД. В то же время, когда я запускаю это из SQLDeveloper - все работает отлично.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы разделяете операторы точкой с запятой ; и косой чертой /. Попробуйте использовать только один из них, но не оба. Если это тоже не сработает, попробуйте выполнить каждый оператор отдельно с помощью execute( )

0 голосов
/ 04 октября 2019

Это прекрасно работает:

        jdbc.execute("create or replace package Z$CLIENT_INTERFACE_API as \n" +
                "    function CL_ORG_SEARCH_CREATE(p_request in clob) return clob;\n" +
                "end Z$CLIENT_INTERFACE_API;\n");
        jdbc.execute("create or replace package body Z$CLIENT_INTERFACE_API as\n" +
                        "    function CL_ORG_SEARCH_CREATE(p_request in clob) return clob\n" +
                        "    is\n" +
                        "        content_xml VARCHAR2(4000);\n" +
                        "        p Dbms_Xmlparser.Parser;\n" +
                        "        v_Doc Dbms_Xmldom.Domdocument;\n" +
                        "        v_Root_Element Dbms_Xmldom.Domelement;\n" +
                        "        v_Child_Nodes Dbms_Xmldom.Domnodelist;\n" +
                        "        v_Child_Node Dbms_Xmldom.Domnode;\n" +
                        "        v_Message_Id VARCHAR2(36);\n" +
                        "        v_First_Char VARCHAR2(1);\n" +
                        "    begin\n" +
                        "        content_xml:=  CAST(p_request as VARCHAR2);\n" +
                        "        p := Dbms_Xmlparser.Newparser;\n" +
                        "        dbms_xmlparser.setvalidationmode(p,False);\n" +
                        "        dbms_xmlparser.parsebuffer(p,content_xml);\n" +
                        "        v_Doc := dbms_xmlparser.getdocument(p);\n" +
                        "        v_Root_Element := Dbms_Xmldom.getdocumentelement(v_Doc);\n" +
                        "        return 'aaaaaaaaaaaaaaaaaaaaaaaaaa1';\n" +
                        "    end;\n" +
                        "end Z$CLIENT_INTERFACE_API;");
...