可以动态地生成需要从表中
SELECT 'SELECT '
|| LISTAGG('MIN("' || COLUMN_NAME || '") AS "MIN_' || COLUMN_NAME || '"'
|| ',MAX("' || COLUMN_NAME || '") AS "MAX_' || COLUMN_NAME || '"'
, ',') WITHIN GROUP (ORDER BY COLUMN_ID)
|| ' FROM TBL'
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'YOURTABLENAME';
其然后可以复制选择所有列,并运行到输出每一列的最小值和最大值的SQL。
如果你在做这一切的动态再坚持(假设各列不同的数据类型):
SQL Fiddle
的Oracle 11g R2架构设置:
CREATE TABLE tbl (
asdfghjkl NUMBER,
poiuytrew VARCHAR2(3),
oiuytrewq DATE,
sdfghjkla NUMBER,
zxcvbnmcv NUMBER,
mnbvcxznb NUMBER,
qwertyuio NUMBER,
wertyuiop NUMBER
);
INSERT INTO tbl
SELECT LEVEL, LPAD(TO_CHAR(LEVEL), 3, '0'), TRUNC(SYSDATE) - LEVEL, LEVEL+1, 10-LEVEL, LEVEL, ABS(5-LEVEL), POWER(0.9, LEVEL)
FROM DUAL
CONNECT BY LEVEL < 10;
CREATE TABLE test AS SELECT * FROM tbl WHERE 1 = 0;
查询1:
SELECT * FROM tbl
Results:
| ASDFGHJKL | POIUYTREW | OIUYTREWQ | SDFGHJKLA | ZXCVBNMCV | MNBVCXZNB | QWERTYUIO | WERTYUIOP |
|-----------|-----------|---------------------------------|-----------|-----------|-----------|-----------|-------------|
| 1 | 001 | December, 15 2013 00:00:00+0000 | 2 | 9 | 1 | 4 | 0.9 |
| 2 | 002 | December, 14 2013 00:00:00+0000 | 3 | 8 | 2 | 3 | 0.81 |
| 3 | 003 | December, 13 2013 00:00:00+0000 | 4 | 7 | 3 | 2 | 0.729 |
| 4 | 004 | December, 12 2013 00:00:00+0000 | 5 | 6 | 4 | 1 | 0.6561 |
| 5 | 005 | December, 11 2013 00:00:00+0000 | 6 | 5 | 5 | 0 | 0.59049 |
| 6 | 006 | December, 10 2013 00:00:00+0000 | 7 | 4 | 6 | 1 | 0.531441 |
| 7 | 007 | December, 09 2013 00:00:00+0000 | 8 | 3 | 7 | 2 | 0.4782969 |
| 8 | 008 | December, 08 2013 00:00:00+0000 | 9 | 2 | 8 | 3 | 0.43046721 |
| 9 | 009 | December, 07 2013 00:00:00+0000 | 10 | 1 | 9 | 4 | 0.387420489 |
查询2:
DECLARE
min_sql CLOB;
max_sql CLOB;
min_rec tbl%ROWTYPE;
max_rec tbl%ROWTYPE;
BEGIN
-- Generate the SQL to find the minimums
SELECT 'SELECT '
|| LISTAGG('MIN("' || COLUMN_NAME || '")', ',')
WITHIN GROUP (ORDER BY COLUMN_ID)
|| ' FROM TBL'
INTO min_sql
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TBL';
-- Generate the SQL to find the maximums
SELECT 'SELECT '
|| LISTAGG('MAX("' || COLUMN_NAME || '")', ',')
WITHIN GROUP (ORDER BY COLUMN_ID)
|| ' FROM TBL'
INTO max_sql
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TBL';
-- Execute the SQL to find the minimums and put the
-- results into a %ROWTYPE record (to ensure dataypes
-- match).
EXECUTE IMMEDIATE min_sql INTO min_rec;
-- Execute the SQL to find the maximums and put the
-- results into a %ROWTYPE record (to ensure dataypes
-- match).
EXECUTE IMMEDIATE max_sql INTO max_rec;
-- Do something with the minimums
INSERT INTO test VALUES min_rec;
-- Do something with the maximums
INSERT INTO test VALUES max_rec;
END;
查询3:
SELECT * FROM test
Results:
| ASDFGHJKL | POIUYTREW | OIUYTREWQ | SDFGHJKLA | ZXCVBNMCV | MNBVCXZNB | QWERTYUIO | WERTYUIOP |
|-----------|-----------|---------------------------------|-----------|-----------|-----------|-----------|-------------|
| 1 | 001 | December, 07 2013 00:00:00+0000 | 2 | 1 | 1 | 0 | 0.387420489 |
| 9 | 009 | December, 15 2013 00:00:00+0000 | 10 | 9 | 9 | 4 | 0.9 |
欢迎来到SO。请阅读这些链接(http://stackoverflow.com/questions/how-to-ask http://sscce.org/),了解如何发布问题。这样你会得到更好的结果。 http://stackoverflow.com/help/on-topic为什么你认为你需要使用PL/SQL而不是一个简单的SQL select语句? – OldProgrammer
请注意,我想创建一个循环,而不是输入max和min 100+次。列名也非常不同。 – user3105364
查看user_tab_columns视图并创建一个动态SQL字符串以使用EXECUTE IMMEDIATE执行。 – OldProgrammer