Oracle
 sql >> база данни >  >> RDS >> Oracle

Деклариране и задаване на променливи в оператор Select

От търсенето, което направих, изглежда, че не можете да декларирате и задавате променливи като тази в операторите Select. Това правилно ли е или пропускам нещо?

В рамките на Oracle PL/SQL и SQL са два отделни езика с две отделни машини. Можете да вградите SQL DML в PL/SQL и това ще ви осигури променливи. Като например следния анонимен PL/SQL блок. Обърнете внимание на / в края не е част от PL/SQL, но казва на SQL*Plus да изпрати предходния блок.

declare 
    v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
    v_Count number;
begin
    select count(*) into v_Count
    from Usage
    where UseTime > v_Date1;
    dbms_output.put_line(v_Count);
end;
/

Проблемът е, че блок, който е еквивалентен на вашия T-SQL код, няма да работи:

SQL> declare 
  2      v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
  3  begin
  4      select VisualId
  5      from Usage
  6      where UseTime > v_Date1;
  7  end;
  8  /
    select VisualId
    *
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

За да се предадат резултатите от заявка от PL/SQL, анонимен блок, съхранена процедура или съхранена функция, курсорът трябва да бъде деклариран, отворен и след това върнат към извикващата програма. (Извън обхвата на отговора на този въпрос. РЕДАКТИРАНЕ: вижте Получаване на набор от резултати от съхранената процедура на Oracle)

Клиентският инструмент, който се свързва с базата данни, може да има свои собствени променливи за свързване. В SQL*Plus:

SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';

PL/SQL procedure successfully completed.

SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
  2  from Usage
  3  where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');

no rows selected

Обърнете внимание, че горното е в SQLПлюс, може да не работи (вероятно няма да) в Toad PL/SQL разработчик и т.н. Редовете, започващи с променлива и exec, са SQL Плюс команди. Те не са SQL или PL/SQL команди. Няма избрани редове, защото таблицата е празна.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изграждане на графика на зависимостта на таблицата с рекурсивна заявка

  2. Lighty за Oracle

  3. Oracle SQL заявка:Извличане на най-новите стойности за група въз основа на времето

  4. Как мога да вмъкна в BLOB колона от израз за вмъкване в sqldeveloper?

  5. ORA-06502:PL/SQL:числова или стойностна грешка:буферът за низ от знаци е твърде малък