{"id":7152,"date":"2016-06-26T23:44:05","date_gmt":"2016-06-26T21:44:05","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=7152"},"modified":"2024-03-27T10:53:44","modified_gmt":"2024-03-27T09:53:44","slug":"plsql-bulk-unwrap","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/","title":{"rendered":"PL\/SQL Bulk Unwrap"},"content":{"rendered":"\n<p>406 days ago I released PL\/SQL Unwrapper for SQL Developer version 0.1.1 and blogged about it. With this extension, you can unwrap the content of a SQL Developer window. Time for an update. With the new version 1.0 you can unwrap multiple selected objects with a few mouse clicks. In this blog post, I show how.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Install Extensions<\/h2>\n\n\n\n<p>I assume that you are already using&nbsp;SQL Developer 4.0.2 or higher. If not then it is about time that you grab the latest version from <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/sql-developer\/index.html\">here<\/a>&nbsp;and install it. It&#8217;s important to note that the extensions won&#8217;t run in older versions&nbsp;of SQL Developer.<\/p>\n\n\n\n<p>Configure the&nbsp;update center <a href=\"https:\/\/update.salvis.com\/\">https:\/\/update.salvis.com\/<\/a> and <a href=\"https:\/\/update.oddgen.org\/\">https:\/\/update.oddgen.org\/<\/a> to install the extensions for SQL Developer:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/updates_oddgen_unwrapper.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"141\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/updates_oddgen_unwrapper.png\" alt=\"updates_oddgen_unwrapper\" class=\"wp-image-7155\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/updates_oddgen_unwrapper.png 385w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/updates_oddgen_unwrapper-300x110.png 300w\" sizes=\"auto, (max-width:767px) 385px, 385px\" \/><\/a><\/figure>\n\n\n\n<p>If you cannot use the update center because your company&#8217;s network restricts internet access then download <a href=\"https:\/\/github.com\/oddgen\/oddgen\/releases\">oddgen<\/a>,  <a href=\"https:\/\/github.com\/Trivadis\/plsql-unwrapper-sqldev\/releases\">unwrapper<\/a> and <a href=\"https:\/\/www.oddgen.org\/download#installation_from_file\">install them from file<\/a>.<\/p>\n\n\n\n<p>Why download oddgen for SQL Developer? Because the bulk unwrap feature is implemented as oddgen plugin. Unwrapping an editor content works without oddgen, but for&nbsp;bulk unwrap you need <a href=\"https:\/\/www.oddgen.org\/\">oddgen<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.&nbsp;Setup Test Environment<\/h2>\n\n\n\n<p>If you have a schema in your Oracle database with wrapped code you may&nbsp;skip this step and use this schema for bulk unwrap.<\/p>\n\n\n\n<p>For the test environment, I&#8217;ve used Morten Braten&#8217;s&nbsp;<a href=\"http:\/\/ora-00001.blogspot.de\/2015\/02\/alexandria-plsql-utility-library-moved-to-github.html\">Alexandria PL\/SQL Utility Library<\/a>. Clone or download the library from <a href=\"https:\/\/github.com\/mortenbra\/alexandria-plsql-utils\">GitHub<\/a>. To install the library you need a dedicated user. Create such a user as SYS on your Oracle database instance as follows:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Create User AX for Alexandria Library<\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE USER ax IDENTIFIED BY ax \nDEFAULT TABLESPACE users\nTEMPORARY TABLESPACE temp;\n\nALTER USER ax QUOTA UNLIMITED ON users;\n\nGRANT connect, resource TO ax;\nGRANT execute ON dbms_crypto TO ax;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">USER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">ax<\/span><span style=\"color: #D4D4D4\"> IDENTIFIED <\/span><span style=\"color: #569CD6\">BY<\/span><span style=\"color: #D4D4D4\"> ax <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">DEFAULT<\/span><span style=\"color: #D4D4D4\"> TABLESPACE users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">TEMPORARY TABLESPACE temp;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">USER<\/span><span style=\"color: #D4D4D4\"> ax QUOTA <\/span><span style=\"color: #569CD6\">UNLIMITED<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> users;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">connect<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">resource<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> ax;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">execute<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> dbms_crypto <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> ax;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Then run the install.sql script in the setup directory of the Alexandria PL\/SQL Utility Library as user AX.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Install Alexandria PL\/SQL Utility Library in Schema AX<\/span><span role=\"button\" tabindex=\"0\" data-code=\"@install.sql\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">@install.<\/span><span style=\"color: #569CD6\">sql<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Wrap the PL\/SQL code except package and type specifications in schema AX by running the script <a href=\"https:\/\/gist.github.com\/PhilippSalvisberg\/0e3b79e93f38af2fa530d4035e4d27ce#file-wrap_schema-sql\">wrap_schema.sql<\/a>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-start:16;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Wrap PL\/SQL Code<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\nDECLARE\n   PROCEDURE wrap_and_install(in_code IN CLOB) IS\n      co_chunksize INTEGER := 8196;\n      l_array      dbms_sql.varchar2a;\n      l_lb         INTEGER := 1;\n      l_ub         INTEGER;\n      l_cursor     PLS_INTEGER;\n   BEGIN\n      l_ub := ceil(sys.dbms_lob.getlength(in_code) \/ co_chunksize);\n      &lt;&lt;clob_chunks&gt;&gt;\n      FOR i IN l_lb .. l_ub\n      LOOP\n         l_array(i) := sys.dbms_lob.substr(lob_loc =&gt; in_code,\n                                           offset  =&gt; (i - 1) * co_chunksize + 1,\n                                           amount  =&gt; co_chunksize);\n      END LOOP clob_chunks;\n      l_cursor := sys.dbms_sql.open_cursor;\n      sys.dbms_sql.parse(c             =&gt; l_cursor,\n                         STATEMENT     =&gt; l_array,\n                         lb            =&gt; l_lb,\n                         ub            =&gt; l_ub,\n                         lfflg         =&gt; FALSE,\n                         language_flag =&gt; sys.dbms_sql.native);\n      sys.dbms_ddl.create_wrapped(ddl =&gt; l_array, lb =&gt; l_lb, ub =&gt; l_ub);\n      sys.dbms_sql.close_cursor(l_cursor);\n   END wrap_and_install;\nBEGIN\n   &lt;&lt;unwrapped_sources&gt;&gt;\n   FOR l_rec IN (SELECT TYPE AS original_type,\n                        CASE TYPE\n                           WHEN 'PACKAGE' THEN\n                            'PACKAGE_SPEC'\n                           WHEN 'PACKAGE BODY' THEN\n                            'PACKAGE_BODY'\n                           WHEN 'TYPE' THEN\n                            'TYPE_SPEC'\n                           WHEN 'TYPE BODY' THEN\n                            'TYPE_BODY'\n                           ELSE\n                            TYPE\n                        END AS object_type,\n                        NAME AS object_name\n                   FROM user_source\n                  WHERE TYPE IN ('FUNCTION',\n                                 'PROCEDURE',\n                                 -- 'PACKAGE',\n                                 'PACKAGE BODY',\n                                 -- 'TYPE',\n                                 'TYPE BODY',\n                                 'LIBRARY')\n                        AND line = 1\n                        AND lower(text) NOT LIKE '% wrapped%'\n                  ORDER BY type, name)\n   LOOP\n      &lt;&lt;try_to_wrap&gt;&gt;\n      DECLARE\n         l_ddl  CLOB;\n         l_code CLOB;\n      BEGIN\n         l_ddl := sys.dbms_metadata.get_ddl(object_type =&gt; l_rec.object_type,\n                                            NAME        =&gt; l_rec.object_name,\n                                            SCHEMA      =&gt; USER);\n         -- wrap with EDITIONABLE clause fails on 12.1.0.2.0 with: \n         --    ORA-24230: input to DBMS_DDL.WRAP is not a legal PL\/SQL unit\n         l_code := REPLACE(l_ddl, 'CREATE OR REPLACE EDITIONABLE ', 'CREATE OR REPLACE ');\n         -- wrapping within database supported through DBMS_DDL since 10gR1\n         wrap_and_install(in_code =&gt; l_code);\n         sys.dbms_output.put_line(l_rec.original_type || ' ' || l_rec.object_name ||\n                                  ' wrapped.');\n      EXCEPTION\n         WHEN OTHERS THEN\n            sys.dbms_output.put_line(l_rec.original_type || ' ' || l_rec.object_name ||\n                                     ' not wrapped because of ' || SQLERRM);\n      END try_to_wrap;\n   END LOOP unwrapped_sources;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">DECLARE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">wrap_and_install<\/span><span style=\"color: #D4D4D4\">(in_code <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      co_chunksize <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\"> := <\/span><span style=\"color: #B5CEA8\">8196<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_array<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">dbms_sql.<\/span><span style=\"color: #4EC9B0\">varchar2a<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_lb<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\"> := <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_ub<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_cursor<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">PLS_INTEGER<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_ub<\/span><span style=\"color: #D4D4D4\"> := <\/span><span style=\"color: #DCDCAA\">ceil<\/span><span style=\"color: #D4D4D4\">(sys.<\/span><span style=\"color: #DCDCAA\">dbms_lob.<\/span><span style=\"color: #4EC9B0\">getlength<\/span><span style=\"color: #D4D4D4\">(in_code) \/ co_chunksize);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&lt;clob_chunks&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> i <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_lb<\/span><span style=\"color: #D4D4D4\"> .. <\/span><span style=\"color: #9CDCFE\">l_ub<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">l_array<\/span><span style=\"color: #D4D4D4\">(i) := sys.<\/span><span style=\"color: #DCDCAA\">dbms_lob.<\/span><span style=\"color: #4EC9B0\">substr<\/span><span style=\"color: #D4D4D4\">(lob_loc =&gt; in_code,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                           offset  =&gt; (i - <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) * co_chunksize + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                           amount  =&gt; co_chunksize);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> clob_chunks;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_cursor<\/span><span style=\"color: #D4D4D4\"> := sys.<\/span><span style=\"color: #DCDCAA\">dbms_sql.<\/span><span style=\"color: #4EC9B0\">open_cursor<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      sys.<\/span><span style=\"color: #DCDCAA\">dbms_sql.<\/span><span style=\"color: #4EC9B0\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">c<\/span><span style=\"color: #D4D4D4\">             =&gt; <\/span><span style=\"color: #9CDCFE\">l_cursor<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         STATEMENT     =&gt; <\/span><span style=\"color: #9CDCFE\">l_array<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         lb            =&gt; <\/span><span style=\"color: #9CDCFE\">l_lb<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         ub            =&gt; <\/span><span style=\"color: #9CDCFE\">l_ub<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         lfflg         =&gt; <\/span><span style=\"color: #569CD6\">FALSE<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         language_flag =&gt; sys.<\/span><span style=\"color: #DCDCAA\">dbms_sql.<\/span><span style=\"color: #4EC9B0\">native<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      sys.<\/span><span style=\"color: #DCDCAA\">dbms_ddl.<\/span><span style=\"color: #4EC9B0\">create_wrapped<\/span><span style=\"color: #D4D4D4\">(ddl =&gt; <\/span><span style=\"color: #9CDCFE\">l_array<\/span><span style=\"color: #D4D4D4\">, lb =&gt; <\/span><span style=\"color: #9CDCFE\">l_lb<\/span><span style=\"color: #D4D4D4\">, ub =&gt; <\/span><span style=\"color: #9CDCFE\">l_ub<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      sys.<\/span><span style=\"color: #DCDCAA\">dbms_sql.<\/span><span style=\"color: #4EC9B0\">close_cursor<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">l_cursor<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> wrap_and_install;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   &lt;&lt;unwrapped_sources&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TYPE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> original_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #C586C0\">CASE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TYPE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #CE9178\">&#39;PACKAGE_SPEC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #CE9178\">&#39;PACKAGE_BODY&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #CE9178\">&#39;TYPE_SPEC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #CE9178\">&#39;TYPE_BODY&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #C586C0\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #569CD6\">TYPE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #569CD6\">NAME<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> user_source<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TYPE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                 <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                 <\/span><span style=\"color: #6A9955\">-- &#39;PACKAGE&#39;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                 <\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                 <\/span><span style=\"color: #6A9955\">-- &#39;TYPE&#39;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                 <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                 <\/span><span style=\"color: #CE9178\">&#39;LIBRARY&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> line = <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">lower<\/span><span style=\"color: #D4D4D4\">(text) <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;% wrapped%&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&lt;try_to_wrap&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">DECLARE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">l_ddl<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">l_code<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">l_ddl<\/span><span style=\"color: #D4D4D4\"> := sys.<\/span><span style=\"color: #DCDCAA\">dbms_metadata.<\/span><span style=\"color: #4EC9B0\">get_ddl<\/span><span style=\"color: #D4D4D4\">(object_type =&gt; <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #569CD6\">NAME<\/span><span style=\"color: #D4D4D4\">        =&gt; <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            SCHEMA      =&gt; <\/span><span style=\"color: #DCDCAA\">USER<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #6A9955\">-- wrap with EDITIONABLE clause fails on 12.1.0.2.0 with: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #6A9955\">--    ORA-24230: input to DBMS_DDL.WRAP is not a legal PL\/SQL unit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">l_code<\/span><span style=\"color: #D4D4D4\"> := <\/span><span style=\"color: #DCDCAA\">REPLACE<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">l_ddl<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;CREATE OR REPLACE EDITIONABLE &#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;CREATE OR REPLACE &#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #6A9955\">-- wrapping within database supported through DBMS_DDL since 10gR1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         wrap_and_install(in_code =&gt; <\/span><span style=\"color: #9CDCFE\">l_code<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         sys.<\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.original_type || <\/span><span style=\"color: #CE9178\">&#39; &#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_name ||<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                  <\/span><span style=\"color: #CE9178\">&#39; wrapped.&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">EXCEPTION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">OTHERS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            sys.<\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.original_type || <\/span><span style=\"color: #CE9178\">&#39; &#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">l_rec<\/span><span style=\"color: #D4D4D4\">.object_name ||<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                     <\/span><span style=\"color: #CE9178\">&#39; not wrapped because of &#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #DCDCAA\">SQLERRM<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> try_to_wrap;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> unwrapped_sources;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. Bulk Unwrap<\/h2>\n\n\n\n<p>Start SQL Developer and open a connection as user AX on your database.<\/p>\n\n\n\n<p>If the oddgen window is not visible then select &#8220;Generators&#8221; from the &#8220;View&#8221; menu as shown in the following picture:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/05\/menu_view_generators.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"252\" height=\"155\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/05\/menu_view_generators.png\" alt=\"menu_view_generators\" class=\"wp-image-7074\"\/><\/a><\/figure>\n\n\n\n<p>Afterwards, the Generators window appears in the lower left corner within SQL Developer.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/generators.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"293\" height=\"132\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/generators.png\" alt=\"generators\" class=\"wp-image-7170\"\/><\/a><\/figure>\n\n\n\n<p>Select the open connection in the combo box of the Generator window.&nbsp;Open the &#8220;PL\/SQL Unwrapper&#8221; node and the &#8220;Package Bodies&#8221; node to show all wrapped package body names.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/generators2.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"294\" height=\"461\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/generators2.png\" alt=\"generators2\" class=\"wp-image-7171\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/generators2.png 294w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2016\/06\/generators2-191x300.png 191w\" sizes=\"auto, (max-width:767px) 294px, 294px\" \/><\/a><\/figure>\n\n\n\n<p>Select some or all package body nodes and press Return to generate the unwrapped code in a new worksheet. Afterwards, you just may execute the generated code. Add &#8220;SET DEFINE OFF&#8221; at the start of the script to ensure&nbsp;unwrapped code containing ampersand (&amp;) characters is processed correctly. Another option is to configure a connection startup script (login.sql) to change the default behaviour.<\/p>\n\n\n\n<p>The following audio-less video shows in just 56 seconds the whole bulk unwrapping process in detail.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/Unwrapper.mp4\"><\/video><\/figure>\n\n\n\n<p>I hope you find this new feature useful.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>406 days ago I released PL\/SQL Unwrapper for SQL Developer version 0.1.1 and blogged about it. With this extension, you can unwrap the content of a SQL Developer window. Time for an update. With the new version 1.0 you can unwrap multiple selected objects with a few mouse clicks. In this blog<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":7146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[94,13,121,87],"class_list":["post-7152","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-oddgen","tag-plsql","tag-pl-sql-unwrapper","tag-sql-developer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>PL\/SQL Bulk Unwrap - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PL\/SQL Bulk Unwrap - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"406 days ago I released PL\/SQL Unwrapper for SQL Developer version 0.1.1 and blogged about it. With this extension, you can unwrap the content of a SQL Developer window. Time for an update. With the new version 1.0 you can unwrap multiple selected objects with a few mouse clicks. In this blog [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-26T21:44:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-27T09:53:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/generators.png\" \/>\n\t<meta property=\"og:image:width\" content=\"291\" \/>\n\t<meta property=\"og:image:height\" content=\"210\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"PL\\\/SQL Bulk Unwrap\",\"datePublished\":\"2016-06-26T21:44:05+00:00\",\"dateModified\":\"2024-03-27T09:53:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/\"},\"wordCount\":485,\"commentCount\":10,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/12\\\/generators.png\",\"keywords\":[\"oddgen\",\"PL\\\/SQL\",\"PL\\\/SQL Unwrapper\",\"SQL Developer\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/\",\"name\":\"PL\\\/SQL Bulk Unwrap - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/12\\\/generators.png\",\"datePublished\":\"2016-06-26T21:44:05+00:00\",\"dateModified\":\"2024-03-27T09:53:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/12\\\/generators.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/12\\\/generators.png\",\"width\":291,\"height\":210},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2016\\\/06\\\/26\\\/plsql-bulk-unwrap\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PL\\\/SQL Bulk Unwrap\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PL\/SQL Bulk Unwrap - Philipp Salvisberg&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/","og_locale":"en_US","og_type":"article","og_title":"PL\/SQL Bulk Unwrap - Philipp Salvisberg&#039;s Blog","og_description":"406 days ago I released PL\/SQL Unwrapper for SQL Developer version 0.1.1 and blogged about it. With this extension, you can unwrap the content of a SQL Developer window. Time for an update. With the new version 1.0 you can unwrap multiple selected objects with a few mouse clicks. In this blog [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2016-06-26T21:44:05+00:00","article_modified_time":"2024-03-27T09:53:44+00:00","og_image":[{"width":291,"height":210,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/generators.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"PL\/SQL Bulk Unwrap","datePublished":"2016-06-26T21:44:05+00:00","dateModified":"2024-03-27T09:53:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/"},"wordCount":485,"commentCount":10,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/generators.png","keywords":["oddgen","PL\/SQL","PL\/SQL Unwrapper","SQL Developer"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/","url":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/","name":"PL\/SQL Bulk Unwrap - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/generators.png","datePublished":"2016-06-26T21:44:05+00:00","dateModified":"2024-03-27T09:53:44+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/generators.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2015\/12\/generators.png","width":291,"height":210},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2016\/06\/26\/plsql-bulk-unwrap\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PL\/SQL Bulk Unwrap"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/7152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=7152"}],"version-history":[{"count":32,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/7152\/revisions"}],"predecessor-version":[{"id":13354,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/7152\/revisions\/13354"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/7146"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=7152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=7152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=7152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}