Files
Omni_kernel.db/basecore/zen_parse_sp.txt
T
2026-02-06 15:09:39 +08:00

125 lines
3.4 KiB
Plaintext

DELIMITER //
CREATE PROCEDURE zen_parse_sp(
IN actiontype VARCHAR(10), -- fields/parain
IN sp_name VARCHAR(200),
IN functiontag VARCHAR(200)
)
/*
function : 想辦法取得 sp 最後回傳的欄位名稱列表
description: 有跨 db 的語法, 記得測試完後要移除
build date : 2021/12/02
call sample:
CALL zen_parse_sp('gexrpt_opor02');
modify history
item who date modify docs
==== ========== ========== ================================================
1 michael 2021/12/02 新增
*/
BEGIN
DECLARE sql_text TEXT;
DECLARE data_text TEXT;
DECLARE pos INT;
DECLARE ret2_col VARCHAR(100);
DECLARE ret2_fieldobject VARCHAR(100);
DECLARE ret2_related_provider VARCHAR(100);
DECLARE ret2_default_value VARCHAR(100);
DECLARE ret2_celly SMALLINT;
DECLARE ret2_seqno INT;
DECLARE ret2_rowid INT;
SELECT text INTO sql_text
FROM information_schema.routines
WHERE routine_name = sp_name AND routine_type = 'PROCEDURE';
-- 回傳的欄位
IF actiontype = 'fields' THEN
SELECT 0 AS code, 'ok' AS msg;
CREATE TEMPORARY TABLE ret2 AS
SELECT
functiontag,
column_name AS fieldname,
column_name AS fieldcn,
CASE WHEN LOCATE('date', data_type) > 0 THEN 'static-date' ELSE 'static' END AS fieldobject,
ordinal_position AS seqno
FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = sp_name;
SELECT * FROM ret2;
-- 傳入的參數
ELSEIF actiontype = 'parain' THEN
-- 取得 () 內的資料
SET pos = LOCATE('/*', sql_text);
IF pos > 0 THEN
SET sql_text = SUBSTRING(sql_text, 1, pos - 5);
END IF;
SET pos = LOCATE('as', sql_text);
IF pos > 0 THEN
SET sql_text = SUBSTRING(sql_text, 1, pos - 5);
END IF;
SET pos = LOCATE('(', sql_text);
SET data_text = SUBSTRING(sql_text, pos + 1, LENGTH(sql_text));
CREATE TEMPORARY TABLE ret2 (
col VARCHAR(100),
fieldobject VARCHAR(100),
related_provider VARCHAR(100),
default_value VARCHAR(100),
celly SMALLINT,
rowid INT AUTO_INCREMENT,
PRIMARY KEY (rowid)
);
-- 開始分析(, 分隔)
INSERT INTO ret2 (col)
SELECT col FROM gf_split(data_text, ',');
UPDATE ret2 SET col = SUBSTRING(col, LOCATE('@', col), LENGTH(col));
UPDATE ret2 SET col = SUBSTRING(col, 1, LOCATE(' ', col) - 1);
-- 想辦法給定一些 default
UPDATE ret2 SET fieldobject = 'input-text', default_value = '*';
UPDATE ret2 SET
fieldobject = 'input-date',
default_value = 'today'
WHERE LOCATE('date', col) > 0;
UPDATE ret2 SET
fieldobject = 'picker',
related_provider = 'basm61'
WHERE LOCATE('cust', col) > 0;
UPDATE ret2 SET
fieldobject = 'picker',
related_provider = 'basm51'
WHERE LOCATE('product', col) > 0;
UPDATE ret2 SET
fieldobject = 'picker',
related_provider = 'basm67'
WHERE LOCATE('person', col) > 0;
-- 如果第一個 para 是 token
SELECT COUNT(*) INTO pos FROM ret2 WHERE rowid = 1 AND LOCATE('token', col) > 0;
IF pos > 0 THEN
UPDATE ret2 SET default_value = '${ls:token}' WHERE LOCATE('token', col) > 0;
END IF;
SELECT 0 AS code, 'ok' AS msg;
SELECT functiontag, col AS fcaption, 1 AS celly, rowid - pos AS seqno, fieldobject, related_provider, default_value
FROM ret2;
END IF;
END //
DELIMITER ;