具有功能的CTAS

时间:2018-11-08 03:57:28

标签: sql oracle plsql oracle11g

我有一个带有以下列的表:age(VARCHAR2),bothsexs(NUMBER),male(NUMBER),female(NUMBER)。我正在尝试使用存储函数编写CTAS语句,该函数将返回百分比(num1 / num2)。对于我的一生,我无法弄清楚。从本质上讲,我希望CTAS给我第二张表,其中包含age(VARCHAR2)和percent(number),其中表1 age的每条记录都被复制,并使用相应的百分比计算方法。

这是我到目前为止所拥有的。

这是我的职责。

CREATE OR REPLACE FUNCTION CALCULATE_PERCENT(NUM1 IN NUMBER,NUM2 IN NUMBER)
  RETURN NUMBER
    IS TOTAL NUMBER;
    BEGIN
      SELECT (NUM1/NUM2) INTO TOTAL FROM DUAL;
      RETURN TOTAL;
    END;

到目前为止,这是我的CTAS。

CREATE TABLE ARMalePercentage (AGE PRIMARY KEY) 
AS SELECT A.AGE, calculate_percent(num1=>A.MALE,num2=>A.BOTHSEXES) 
 "Percent Male Population" from arkansas2010census a;

我是SQL的新手,不知道我在做什么错,因此可以提供任何帮助。

解决方案:

CREATE TABLE ARMalePercentage (AGE PRIMARY KEY, "Percent Male Population") AS SELECT A.AGE, (select calculate_percent(a.MALE,a.BOTH_SEXES) from dual) "Percent Male Population" FROM arkansas2010census a;

2 个答案:

答案 0 :(得分:2)

无需为了查看计算出的列而创建表。而是创建一个CREATE OR REPLACE FUNCTION calculate_percent ( num1 IN NUMBER, num2 IN NUMBER ) RETURN NUMBER DETERMINISTIC --marks a function that returns predictable results IS BEGIN RETURN ROUND( ( num1 / num2 ) * 100.00,2); --Optional rounding to 2 decimal places END; /

可以简化您的功能。

CREATE OR REPLACE VIEW armalepercentage AS
     SELECT a.age,
            calculate_percent(a.male,a.bothsexes) AS  "Percent Male Population"
     FROM arkansas2010census a;

查看

ALTER TABLE arkansas2010census ADD (
     PCT_MALE NUMBER GENERATED ALWAYS AS ( calculate_percent(male,both_sexes) )
);

或者只是向现有表中添加VIRTUAL COLUMN

=

答案 1 :(得分:1)

您正在创建一个名为ARMalePercentage且具有 one 列的表AGE,该表具有主键约束,并尝试使用返回的查询填充该表>两个A.AGE和函数结果。

我想你想要

CREATE TABLE ARMalePercentage (AGE PRIMARY KEY, PCT_MALE) 
   AS SELECT A.AGE, 
      calculate_percent(num1=>A.MALE,num2=>A.BOTHSEXES) "Percent Male Population"
      from arkansas2010census a;

您可以尝试运行语句的SELECT部分,以查看是否返回两列。