First up from me is PL/SQL Obfuscation. The idea is to simply make the code unreadable. This is done in various language mostly for protection of the intelectual property. The website, http://perl.plover.com/obfuscated/ shows this examplefrom a contest that used to run for Perl.
@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print
The PL/SQL one SQL Developer now has isn't to this extreme but does make the code quite difficult to read. If someone obfuscated and then wrapped the code, that would be 2 hurdles in the way to assist licensing and other agreements to protect the IP invested.
Here's the steps to try it out.
1) Open a PL/SQL Object. This is a package I have that mirror DBMS_OUTPUT but send to a pipe instead. It allows me to basically do a tail -f on my code's log messages and watch it as it processes. If anyone is interested in that I can write it up another time.
2) Right click and choose Obfuscate...
3) SQL Developer will prompt to save the non-obfuscated code so there is a readable copy.
4) Check out the sources. It can be undone by a determined person quite easy with a lot of search and replace but at least it puts a hurdle in the way.
create or replace
PACKAGE BODY pipe_output IS
PROCEDURE set_pipeoutput_on IS
-- Opens the communication pipe
BEGIN
pv_pipe_on_bln := TRUE;
END set_pipeoutput_on;
PROCEDURE put_line (p_pipe_name VARCHAR2,p_message_txt VARCHAR2) IS
-- Sends the username of the executing user and a message to the pipe
"CpaX6WrU0YmLxF5r4E46dw==" PLS_INTEGER;
"Y1QFM4yVoF5S9b7fNyG/YQ==" varchar2(4000);
BEGIN
if ( pv_pipe_on_bln ) then
"Y1QFM4yVoF5S9b7fNyG/YQ==" := to_char(systimestamp,'HH24:MI:SS.FF6') ||':'||p_message_txt;
DBMS_PIPE.PACK_MESSAGE("Y1QFM4yVoF5S9b7fNyG/YQ==");
"CpaX6WrU0YmLxF5r4E46dw==" := DBMS_PIPE.SEND_MESSAGE(p_pipe_name,0.0001);
end if;
END put_line;
PROCEDURE put_line (p_message_txt VARCHAR2) IS
-- Sends the username of the executing user and a message to the pipe
"CpaX6WrU0YmLxF5r4E46dw==" PLS_INTEGER;
BEGIN
IF (pv_pipe_on_bln) THEN
DBMS_PIPE.PACK_MESSAGE(USER);
DBMS_PIPE.PACK_MESSAGE(p_message_txt);
"CpaX6WrU0YmLxF5r4E46dw==" := DBMS_PIPE.SEND_MESSAGE('OUTPUT');
END IF;
END put_line;
PROCEDURE get_line (p_waittime_num NUMBER := 1) IS
-- Monitors the pipe based on a specified wait time, reading and
-- displaying the username and messages as they are sent from the
-- executing process.
"CpaX6WrU0YmLxF5r4E46dw==" PLS_INTEGER;
"cy5MsI3IbOrf1eySVcYcZQ==" VARCHAR2(30);
"9C7AbyOB7jrbTAPf3Xpm7w==" VARCHAR2(2000);
"=C7AbyOB7joas2oSfUfb6NF431LXcf" BOOLEAN := FALSE;
BEGIN
LOOP
"CpaX6WrU0YmLxF5r4E46dw==" := DBMS_PIPE.RECEIVE_MESSAGE('OUTPUT',
p_waittime_num);
EXIT WHEN ("CpaX6WrU0YmLxF5r4E46dw==" != 0);
"=C7AbyOB7joas2oSfUfb6NF431LXcf" := TRUE;
DBMS_PIPE.UNPACK_MESSAGE("cy5MsI3IbOrf1eySVcYcZQ==");
DBMS_PIPE.UNPACK_MESSAGE("9C7AbyOB7jrbTAPf3Xpm7w==");
DBMS_OUTPUT.PUT_LINE(RPAD('USER: '||"cy5MsI3IbOrf1eySVcYcZQ==",30)||
'MESSAGE: '||"9C7AbyOB7jrbTAPf3Xpm7w==");
END LOOP;
IF NOT "=C7AbyOB7joas2oSfUfb6NF431LXcf" THEN
DBMS_OUTPUT.PUT_LINE('No output in pipe.');
END IF;
END get_line;
PROCEDURE get_line (p_pipe_name VARCHAR2,p_waittime_num NUMBER := 1) IS
-- Monitors the pipe based on a specified wait time, reading and
-- displaying the username and messages as they are sent from the
-- executing process.
"CpaX6WrU0YmLxF5r4E46dw==" PLS_INTEGER;
"cy5MsI3IbOrf1eySVcYcZQ==" VARCHAR2(30);
"9C7AbyOB7jrbTAPf3Xpm7w==" VARCHAR2(2000);
"=C7AbyOB7joas2oSfUfb6NF431LXcf" BOOLEAN := FALSE;
BEGIN
LOOP
"CpaX6WrU0YmLxF5r4E46dw==" := DBMS_PIPE.RECEIVE_MESSAGE(p_pipe_name,
p_waittime_num);
EXIT WHEN ("CpaX6WrU0YmLxF5r4E46dw==" != 0);
"=C7AbyOB7joas2oSfUfb6NF431LXcf" := TRUE;
DBMS_PIPE.UNPACK_MESSAGE("cy5MsI3IbOrf1eySVcYcZQ==");
DBMS_PIPE.UNPACK_MESSAGE("9C7AbyOB7jrbTAPf3Xpm7w==");
DBMS_OUTPUT.PUT_LINE('MESSAGE: '||"9C7AbyOB7jrbTAPf3Xpm7w==");
END LOOP;
IF NOT "=C7AbyOB7joas2oSfUfb6NF431LXcf" THEN
DBMS_OUTPUT.PUT_LINE('No output in pipe.');
END IF;
END get_line;
PROCEDURE get_line (p_pipe_name IN VARCHAR2,p_waittime_num IN NUMBER := 1,p_message OUT VARCHAR2)
IS
-- Monitors the pipe based on a specified wait time, reading and
-- displaying the username and messages as they are sent from the
-- executing process.
"CpaX6WrU0YmLxF5r4E46dw==" PLS_INTEGER;
"9C7AbyOB7jrbTAPf3Xpm7w==" VARCHAR2(2000);
BEGIN
LOOP
PUT_LINE('KLRICE','Recieving');
"CpaX6WrU0YmLxF5r4E46dw==" := DBMS_PIPE.RECEIVE_MESSAGE(p_pipe_name, p_waittime_num);
EXIT WHEN ("CpaX6WrU0YmLxF5r4E46dw==" != 0);
PUT_LINE('KLRICE','got something');
DBMS_PIPE.UNPACK_MESSAGE("9C7AbyOB7jrbTAPf3Xpm7w==");
p_message :="9C7AbyOB7jrbTAPf3Xpm7w==";
END LOOP;
END get_line;
END pipe_output;