|
今天闲着无聊,学习xqmei把自己的SQL进行了一番反人类的包装,
用#取代SELECT, $取代FROM, %取代DUAL UNION, ^取代WHERE,!取代GROUP BY
CREATE OR REPLACE PACKAGE BODY FIVESQUARESHAPE
AS
PROCEDURE
o
(p
CHAR)
AS
C
SYS_REFCURSOR;
R
LONG;
S
LONG;
BEGIN
S:='WITH
c
AS
(#
TRUNC((LEVEL-1)/5)
X
,MOD(LEVEL-1,5)
Y
,POWER(2,25-LEVEL)
i
,LEVEL
n
$
DUAL
CONNECT
BY
LEVEL<=25
)
,d
AS
(
#
c.i
j
,d.i
k
,c.n
$
c,c
d
^ ABS(c.X-d.X)+ABS(c.Y-d.Y)=1
)
,t(c,s,m)
AS
(
#
1,i,n
$
C
UNION
ALL
#
c+1,s+j,m+n
$ t,d
^
BITAND(s,j)=0
AND
BITAND(s,k)>0
AND
c<5
)
,s
AS
(#
DISTINCT
s,m,''''
q
$
t
^
c=5)
,a
AS
(#
*
$
s
^
NOT
EXISTS
(#
1
$ s
v,c
^
i>1
AND
s=s.s*i))'
||NVL(p,
',r
AS
(
#
0
v
,1
d
,0
e
,0
f
,1
g
$
%
#
1,-1,0,0,1
$
%
#
2,1,0,0,-1
$
%
# 3,-1,0,0,-1
$
%
#
4,0,-1,-1,0
$
%
#
5,0,1,1,0
$
%
#
6,0,1,-1,0
$
%
#
7,0,-1,1,0
$
DUAL
)
,ba
AS
(
#
s,m,COUNT(*)
q
$
(#
MAX(h)
KEEP(DENSE_RANK
FIRST
ORDER
BY
n)
s
,MIN(n)
m
$
(#
s
,SUM(i)
h
,SUM(n)
n
$
(#
s,v
,x-MIN(x)
OVER(PARTITION
BY
s,v)
u
,y-MIN(y)
OVER(PARTITION
BY
s,v)
w
$ (#
a.s,v,x*d+y*e
x
,x*f+y*g
y
$
a,c,r
^
BITAND(s,i)>0
)
)
,c
^
u=x
AND
w=y
!
s,v
)
!
s
)
!
s,m
)')
||Q'{#
RPAD(DECODE(x,0,m||' '||q,' '),16)||LISTAGG(DECODE(SIGN(BITAND(S,i)),1,'■','□'))
WITHIN
GROUP
(ORDER
BY
Y)
$
}'||NVL(p,'b')||'a,c
!
s,m,x,q
ORDER
BY
m,-s,x';
OPEN
C
FOR
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(S,'#','SELECT'),'$','FROM'),'%','DUAL UNION'),'^','WHERE'),'!','GROUP BY');
LOOP
FETCH
C
INTO
R;
EXIT
WHEN
C%NOTFOUND;
dbms_output.put_line(R);
END
LOOP;
END;
procedure
output_allshapes AS
BEGIN
O(' ');
END;
procedure
output_allbaseshapes
AS
BEGIN
O('');
END;
END;
/
现在的代码长度:
WITH NOCRLF AS (SELECT RTRIM(TEXT,CHR(10)||CHR(13)) NOCRLFTEXT FROM USER_SOURCE WHERE NAME='FIVESQUARESHAPE' AND TYPE IN ('PACKAGE', 'PACKAGE BODY')),
NOSPTB AS (SELECT RTRIM(LTRIM(NOCRLFTEXT,CHR(9)||CHR(32)),CHR(9)||CHR(32)) TRIMTEXT FROM NOCRLF)
SELECT SUM(LENGTHB(TRIMTEXT)) FROM NOSPTB;
SUM(LENGTHB(TRIMTEXT))
----------------------
1273
|
|