行變列構建sql語句
很久以前做開發時候寫的儲存過程.
CREATE OR REPLACE PROCEDURE sp_test (
p_tablename IN CHAR, --表名
p_columnname IN CHAR, --行變列的條件列(在此例中是xbie00)
p_columnout IN CHAR, --需要彙總的列(此例是rs0000)
p_columnwhere IN CHAR --根據那個列來變(此例是zrc000)
)
IS
TYPE cur_typ IS REF CURSOR;
c_1 cur_typ; --動態遊標
v_temptable VARCHAR2 (50); --臨時表
v_sql VARCHAR2 (200); --SQL語句
v_count NUMBER; --總數
v_outsql VARCHAR2 (300); --生成的sql語句
v_temp VARCHAR2 (200); --臨時變數
v_xbie00 CHAR (1); --性別
BEGIN
BEGIN
EXECUTE IMMEDIATE 'drop table '
|| p_columnname
|| '_temp'; --Drop臨時表
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
v_temptable := p_columnname
|| '_temp';
v_sql := 'create table '
|| v_temptable
|| ' as select '
|| p_columnname
|| ' from '
|| p_tablename
|| ' group by '
|| p_columnname
|| ' order by '
|| p_columnname;
DBMS_OUTPUT.put_line (v_sql); --生成臨時表(注意: 使用者需要有create any table 系統許可權
EXECUTE IMMEDIATE v_sql;
v_sql :=
'select count(distinct '
|| p_columnname
|| ') from '
|| p_tablename; --有多少性別
DBMS_OUTPUT.put_line (v_sql);
EXECUTE IMMEDIATE v_sql
INTO v_count;
v_outsql := 'select t1.zrc000,';
v_sql := 'select '
|| p_columnname
|| ' from '
|| p_tablename
|| ' group by '
|| p_columnname; --構建SqL語句
/*
v_sql := 'select '
|| v_temp
|| p_columnname
|| ' ),from '
|| p_tablename
|| ' group by '
|| p_columnname;
*/
OPEN c_1 FOR v_sql;
LOOP
FETCH c_1 INTO v_xbie00; --取性別
EXIT WHEN c_1%NOTFOUND;
v_temp := '(select '
|| p_columnout
|| ' from '
|| p_tablename
|| ' where '
|| p_columnname
|| ' = '
|| v_xbie00
|| ' and '
|| p_columnwhere
|| ' = t1.'
|| p_columnwhere
|| ' ),'; --對某個性別生成sql語句
v_outsql := v_outsql
|| v_temp; --構建sql語句
END LOOP;
CLOSE c_1;
v_outsql := SUBSTR (v_outsql, 1, LENGTH (TRIM (v_outsql))
- 1); --把最後的','去掉
v_outsql := v_outsql
|| ' from (select '
|| p_columnwhere
|| ' from '
|| p_tablename
|| ' group by '
|| p_columnwhere
|| ' ) t1'; --最後的sql部分
DELETE t_sql;
INSERT INTO t_sql
(str_sql)
VALUES (v_outsql); --插入表中
-- 清除臨時表
BEGIN
EXECUTE IMMEDIATE 'drop table '
|| p_columnname
|| '_temp'; --Drop臨時表
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
EXCEPTION
WHEN OTHERS
THEN
raise_application_error (-20637, 'error : '
|| v_sql);
END;
/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-21559/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL SERVER 中構建執行動態SQL語句SQLServer
- Oracle 行轉列的sql語句OracleSQL
- Sql建表語句SQL
- sql 建表語句SQL
- Oracle行轉列、列轉行的Sql語句總結OracleSQL
- 執行sql語句給外部變數賦值SQL變數賦值
- 例項詳解如何構建動態SQL語句SQL
- sql語句批量執行SQL
- sql宣告變數,及if -else語句、while語句的用法SQL變數While
- mysql 查詢建表語句sqlMySql
- SQL語句執行順序及建議--歸納整理SQL
- 老生常談SQL2005語句實現行轉列,列轉行SQL
- 一條SQL語句的執行計劃變化探究SQL
- excel表結構生成powerDesigner模型,生成建表語句sqlExcel模型SQL
- sql 2005 返回列描述的SQL語句SQL
- SQL Server SQL語句執行順序SQLServer
- 獲取物件的構建語句物件
- sql語句如何執行的SQL
- SQL語句執行順序SQL
- 執行大的sql語句SQL
- toad執行sql語句SQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- SQL語句查詢表結構SQL
- SQLite SQL語句結構詳解SQLite
- 一條簡單SQL語句的構成及語句解析SQL
- mysql執行sql語句過程MySql
- Mybatis 動態執行SQL語句MyBatisSQL
- mysql的sql語句執行流程MySql
- sql語句執行緩慢分析SQL
- SQL 語句的執行順序SQL
- 後臺執行SQL語句(oracle)SQLOracle
- Hibernate 執行原始SQL語句SQL
- Oracle SQL語句執行步驟OracleSQL
- SQL 語句select top 變數問題SQL變數
- SQL語句SQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- mysql建表常用sql語句個人經驗分享MySql
- 一條sql語句的建議調優分析SQL