CTAS с функцией - PullRequest
       8

CTAS с функцией

0 голосов
/ 08 ноября 2018

У меня есть таблица со следующими столбцами: возраст (VARCHAR2), оба пола (NUMBER), мужской (NUMBER), женский (NUMBER). Я пытаюсь написать оператор CTAS, используя хранимую функцию, которая будет возвращать процент (num1 / num2). Для жизни я не могу понять это. по сути, я хочу, чтобы CTAS дал мне вторую таблицу с возрастом (VARCHAR2) и процентами (числом), при этом каждая запись из возраста таблицы 1 будет скопирована с соответствующим расчетом для процента.

Это то, что я имею до сих пор.

Вот моя функция.

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 голосов
/ 08 ноября 2018

Нет необходимости создавать таблицу только для просмотра рассчитанных столбцов. Скорее создайте VIEW.

Ваша функция может быть упрощена.

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;
/

View

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

Или просто добавьте VIRTUAL COLUMN к существующей таблице

ALTER TABLE arkansas2010census ADD (
     PCT_MALE NUMBER GENERATED ALWAYS AS ( calculate_percent(male,both_sexes) )
);
0 голосов
/ 08 ноября 2018

Вы создаете таблицу ARMalePercentage с одним столбцом с именем AGE, которая имеет ограничение первичного ключа, и пытаетесь заполнить ее запросом, который возвращает two столбцы, 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, чтобы увидеть, что вы получаете два столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...