Appearance
创建一个自增序列
SEQUENCE-序列
sql
CREATE SEQUENCE "SAPHANADB"."SEQ_ZEB_EXPLAIN" --创建一个名为SEQ_ZEB_EXPLAIN的序列
increment BY 1 --递增量
maxvalue 99999999 --最大值
minvalue 1 --最小值
NO CYCLE --是否为一个圈
start WITH 1 --初始值
DROP SEQUENCE "SAPHANADB"."SEQ_ZEB_EXPLAIN" --删除序列
SELECT SEQ_ZEB_EXPLAIN.currval FROM DUMMY --查询当前序列
SELECT SEQ_ZEB_EXPLAIN.nextval FROM DUMMY --执行并查询下一个序列
TRIGGER-触发器
sql
CREATE OR REPLACE TRIGGER "SAPHANADB"."TRI_ZEB_EXPLAIN" --创建或重新创建一个名为TRI_ZEB_EXPLAIN的触发器
BEFORE INSERT ON "SAPHANADB"."ZEB_EXPLAIN" --在对ZEB_EXPLAIN表进行插入事件之前执行
REFERENCING NEW ROW MYNEWROW --将单条记录重命名为MYNEWROW
FOR EACH ROW --每条记录都适用
BEGIN
DECLARE NEW_ID NUMBER(10); --声明一个名为NEW_ID的数字变量
DECLARE NEW_TIME TIMESTAMP; --声明一个名为NEW_TIME的时间戳变量
SELECT SEQ_ZEB_EXPLAIN.NEXTVAL INTO NEW_ID FROM DUMMY; --序列的下一个值赋值到NEW_ID
MYNEWROW.ID = :NEW_ID; --赋值
SELECT CURRENT_TIMESTAMP INTO NEW_TIME FROM DUMMY; --当前时间戳赋值到NEW_TIME
MYNEWROW.EDIT_TIME = :NEW_TIME; --赋值
END
DROP TRIGGER "SAPHANADB"."TRI_ZEB_EXPLAIN" --删除触发器
存储过程-DEMO
sql
CREATE OR REPLACE PROCEDURE PRO_SELECT_TABLE (
IN tableName varchar(50) default 'ZEB_EXPLAIN',
IN fieldsKey varchar(20) default NULL,
IN status varchar(10) default '=',
IN fieldsValue varchar(20) default NULL,
IN fieldsKey1 varchar(20) default NULL,
IN status1 varchar(10) default '=',
IN fieldsValue1 varchar(20) default NULL
--,OUT outTable tableType --与WITH result联动,tableType填写返回表的类型
) --定义了with result view 必须有out参数,且必须为table类型
LANGUAGE sqlscript --指定存储过程实现的程序语言,默认为: SQLSCRIPT
SQL security invoker --指定存储过程的安全模式,默认: DEFINER
reads SQL data --存储过程为只读的,不能包含DDL与DML(INSERT、UPDATE、DELETE)语句,如果调用其他存储过程,则被调用过程也是只读的。设置参数会有特定的优化
--WITH result VIEW TEST --将只读取存储过程的输出看做结果视图,可以被其他查询SQL用来查询,此时存储过程就像一个表或视图
AS
BEGIN
/*
declare reserveFields varchar(20) := '';
--WHILE循环,可用于批量添加数据
WHILE :reserveFields <= CURRENT_DATE DO //判断条件
---
reserveFields := LAST_DAY(ADD_MONTHS(:CURR_DATE,1)); //变量CURR_DATE递增
END WHILE;
--FOR循环,可用于更改数据
DECLARE CURSOR vernier FOR SELECT * FROM exampleTable; //声明游标变量CUR
FOR rowData AS vernier DO
---
END FOR;
*/
declare sqlString varchar(200) default CONCAT('SELECT * FROM ', :tableName);
IF (:fieldsKey IS NOT NULL AND :fieldsValue IS NOT NULL) THEN --不能写成 <> NULL 或 != NULL
sqlString := CONCAT(:sqlString, ' WHERE ');
sqlString := CONCAT(:sqlString, '"');
sqlString := CONCAT(:sqlString, :fieldsKey);
sqlString := CONCAT(:sqlString, '" ');
sqlString := CONCAT(:sqlString, :status);
sqlString := CONCAT(:sqlString, ' '''); --双单引号变单引号
sqlString := CONCAT(:sqlString, :fieldsValue);
sqlString := CONCAT(:sqlString, '''');
IF (:fieldsKey1 IS NOT NULL AND :fieldsValue1 IS NOT NULL) THEN
sqlString := CONCAT(:sqlString, ' AND ');
sqlString := CONCAT(:sqlString, '"');
sqlString := CONCAT(:sqlString, :fieldsKey1);
sqlString := CONCAT(:sqlString, '" ');
sqlString := CONCAT(:sqlString, :status1);
sqlString := CONCAT(:sqlString, ' '''); --双单引号变单引号
sqlString := CONCAT(:sqlString, :fieldsValue1);
sqlString := CONCAT(:sqlString, '''');
--ELSE 写其他条件
END IF;
--ELSE 写其他条件
END IF;
--EXEC(:sqlString); --执行但不显示
EXECUTE IMMEDIATE :sqlString;
END;
CALL PRO_SELECT_TABLE(); --调用存储过程
DROP PROCEDURE PRO_SELECT_TABLE --删除存储过程
函数-DEMO
SQL
create function FT_UTIL_SPLIT
(
in i_Text nvarchar(4000) DEFAULT '', -- 字符串
in i_splitChar nvarchar(1) DEFAULT ',' -- 分隔符
)
returns table
(
FCODE nvarchar(100)
)
Language SQLScript
as
Begin
declare _items varchar(100) ARRAY;
declare _text varchar(4000);
declare _index integer;
_text := :i_Text;
_index := 1;
WHILE LOCATE(:_text,i_splitChar) > 0 DO
_items[:_index] := SUBSTR_BEFORE(:_text,i_splitChar);
_text := SUBSTR_AFTER(:_text,i_splitChar);
_index := :_index + 1;
END WHILE;
_items[:_index] := :_text;
rst = UNNEST(:_items) AS ("FCODE"); -- 存入临时表rst
return
SELECT * FROM :rst;
end;
DROP FUNCTION FT_UTIL_SPLIT
视图-DEMO
分为图形视图和普通视图,视图可传参,普通视图可用:fieldName
传参
引用方式👇
sql
SELECT * FROM "_SYS_BIC"."STL_01.LL/ZGC_MM_CPKCMX"(
PLACEHOLDER."$$ZCALDAY$$" => REPLACE(LEFT(CURRENT_DATE,10),'-','')
)
SELECT * FROM "_SYS_BIC"."STL_01.LL/ZGC_SD_HTMX"(
'PLACEHOLDER' = ('$$ZF_DATE$$','20230913'),
'PLACEHOLDER' = ('$$ZF_DATE$$','20230913'),
)
实用例子
中文排序-函数
SQL
CREATE FUNCTION ZGA_GET_ZH_SPELL
(
in str varchar(300)
)
RETURNS
c NVARCHAR(300)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS
chh NVARCHAR(300);
chn NVARCHAR(300);
chs NVARCHAR(300);
BEGIN
c:='';
WHILE (LENGTH(str)>0) DO
--依次取单个字符 GB2312 区位编码,
chh := LEFT(str,1);
chn := STRTOBIN(LEFT(str,1),'GB2312') ;
--汉字字符,返回字符对应首字母,非汉字字符,返回原字符
IF(Least(chn,'B0A1')='B0A1' AND Greatest(chn,'D7F9')='D7F9')
THEN
select
case when Least(chn,'B0A1') = 'B0A1' then
(
case when Greatest(chn,'B0C4') = 'B0C4' then 'A'
else case when Greatest(chn,'B2C0') = 'B2C0' then 'B'
else case when Greatest(chn,'B4ED') = 'B4ED' then 'C'
else case when Greatest(chn,'B6E9') = 'B6E9' then 'D'
else case when Greatest(chn,'B7A1') = 'B7A1' then 'E'
else case when Greatest(chn,'B8C0') = 'B8C0' then 'F'
else case when Greatest(chn,'B9FD') = 'B9FD' then 'G'
else case when Greatest(chn,'BBF6') = 'BBF6' then 'H'
else case when Greatest(chn,'BFA5') = 'BFA5' then 'J'
else case when Greatest(chn,'C0AB') = 'C0AB' then 'K'
else case when Greatest(chn,'C2E7') = 'C2E7' then 'L'
else case when Greatest(chn,'C4C2') = 'C4C2' then 'M'
else case when Greatest(chn,'C5B5') = 'C5B5' then 'N'
else case when Greatest(chn,'C5BD') = 'C5BD' then 'O'
else case when Greatest(chn,'C6D9') = 'C6D9' then 'P'
else case when Greatest(chn,'C8BA') = 'C8BA' then 'Q'
else case when Greatest(chn,'C8F5') = 'C8F5' then 'R'
else case when Greatest(chn,'CBF9') = 'CBF9' then 'S'
else case when Greatest(chn,'CDD9') = 'CDD9' then 'T'
else case when Greatest(chn,'CEF4') = 'CEF4' then 'W'
else case when Greatest(chn,'D1B8') = 'D1B8' then 'X'
else case when Greatest(chn,'D4D0') = 'D4D0' then 'Y'
else 'Z'
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end )
else ' ' end
INTO chs FROM DUMMY;
ELSE
chs:=UPPER(chh);
END IF;
str:=RIGHT(str,LENGTH(str)-1);
c:=c||chs ;
END WHILE;
END;
指定排序-函数
sql
CREATE OR REPLACE FUNCTION ZGA_ORDER_BY
(
in str varchar(50),
in param varchar(300)
)
RETURNS
c NVARCHAR(50)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS
sb NVARCHAR(300);
BEGIN
sb := SUBSTR_BEFORE(CONCAT(',',:param),:str);
c := LENGTH(:sb) - LENGTH(REPLACE(:sb,',',''));
IF (:c = '0') THEN C := '99999999999';
END IF;
END;
HANA数据库信息
sql
--对象依赖情况
SELECT
D.BASE_OBJECT_NAME OBJECT_NAME,
D.BASE_OBJECT_TYPE OBJECT_TYPE,
D.DEPENDENT_OBJECT_NAME DEP_OBJECT_NAME,
D.DEPENDENT_OBJECT_TYPE DEP_OBJECT_TYPE
FROM
( SELECT /* MODIFICATION SECTION */
'HCASHIER7' BASE_OBJECT_NAME,
'TABLE' BASE_OBJECT_TYPE,
'%' DEPENDENT_OBJECT_NAME,
'%' DEPENDENT_OBJECT_TYPE
FROM
DUMMY
) BI,
OBJECT_DEPENDENCIES D
WHERE
D.BASE_OBJECT_NAME LIKE BI.BASE_OBJECT_NAME AND
D.BASE_OBJECT_TYPE LIKE BI.BASE_OBJECT_TYPE AND
D.DEPENDENT_OBJECT_NAME LIKE BI.DEPENDENT_OBJECT_NAME AND
D.DEPENDENT_OBJECT_TYPE LIKE BI.DEPENDENT_OBJECT_TYPE
ORDER BY
D.BASE_OBJECT_NAME,
D.BASE_OBJECT_TYPE,
D.DEPENDENT_OBJECT_NAME,
D.DEPENDENT_OBJECT_TYPE;
--表压缩情况
SELECT CURRENT_TIMESTAMP
--,COLUMN_NAME AS "COLUMN",LOADED
,SUM(ROUND(UNCOMPRESSED_SIZE/1024/1024)) AS "UNCOMPRESSED MB"
,SUM(ROUND(MEMORY_SIZE_IN_MAIN/1024/1024)) AS "MAIN MB"
,SUM(ROUND(MEMORY_SIZE_IN_DELTA/1024/1024)) AS "DELTA MB"
,SUM(ROUND(MEMORY_SIZE_IN_TOTAL/1024/1024)) AS "TOTAL USED MB"
--,ROUND(COMPRESSION_RATIO_IN_PERCENTAGE/100,2) AS "COMPR.RATIO"
FROM M_CS_COLUMNS
WHERE TABLE_NAME='XXX'-- AND LOADED='TRUE'
GROUP BY TABLE_NAME;
--表分区情况
SELECT *
FROM M_CS_PARTITIONS
WHERE 1=1
AND (SCHEMA_NAME,TABLE_NAME) IN
(SELECT SCHEMA_NAME,TABLE_NAME FROM M_CS_PARTITIONS
GROUP BY SCHEMA_NAME,TABLE_NAME HAVING --COUNT(1)=1
COUNT(1)=13 AND COUNT(1)!=1--13是按月的,1是没有分区的
)
ORDER BY 1,2,3,4,5,6;
--表DELTA MERGE情况
SELECT
CURRENT_TIMESTAMP,A.SCHEMA_NAME,A.TABLE_NAME
,SUM(A.MEMORY_SIZE_IN_TOTAL/1024/1024/1024) MEMORY_SIZE_IN_TOTAL_GB
,SUM(A.MEMORY_SIZE_IN_DELTA/1024/1024/1024) MEMORY_SIZE_IN_DELTA_GB
,MAX(A.LAST_MERGE_TIME) LAST_MERGE_TIME
,MAX(B.AUTO_MERGE_ON) AUTO_MERGE_ON
,SUM(A.RECORD_COUNT) RECORD_COUNT
,'MERGE DELTA OF ' || A.SCHEMA_NAME || '.' || A.TABLE_NAME || ';' MERGE_SQL
,'ALTER TABLE ' || A.SCHEMA_NAME || '.' || A.TABLE_NAME || ' DISABLE AUTOMERGE;' --ENABLE
FROM M_CS_TABLES A
LEFT JOIN TABLES B ON A.SCHEMA_NAME=B.SCHEMA_NAME AND A.TABLE_NAME=B.TABLE_NAME
WHERE 1=1
AND A.SCHEMA_NAME = 'XXX'
--AND A.TABLE_NAME='XXX'
GROUP BY A.SCHEMA_NAME,A.TABLE_NAME;
SELECT
CURRENT_TIMESTAMP,*
FROM M_DELTA_MERGE_STATISTICS
WHERE 1=1 AND SCHEMA_NAME='XXX' AND TABLE_NAME='XXX'
ORDER BY SCHEMA_NAME,TABLE_NAME;
--列加载情况
SELECT SCHEMA_NAME
,TABLE_NAME
,IS_DELTA_LOADED
,IS_DELTA2_ACTIVE
,LOADED
,LAST_MERGE_TIME
FROM M_CS_TABLES
WHERE 1=1
--AND IS_DELTA2_ACTIVE='TRUE'
AND SCHEMA_NAME='XXX' AND TABLE_NAME='XXX';
--列索引情况
SELECT CURRENT_TIMESTAMP
,SCHEMA_NAME
,TABLE_NAME
,INDEX_NAME
,CONSTRAINT
,STRING_AGG(COLUMN_NAME,',') INDEX_COLUMN_STRING
FROM INDEX_COLUMNS
WHERE SCHEMA_NAME='XXX'
GROUP BY SCHEMA_NAME,TABLE_NAME,INDEX_NAME,CONSTRAINT
ORDER BY SCHEMA_NAME,TABLE_NAME,INDEX_NAME,CONSTRAINT;