Вам нужно сделать еще несколько шагов на основе документации по обработке коллекции в Pro * C .
Сначала создайте файл с именем int55_in.typ
, содержащий имя вашего типа коллекции:
case=lower
type int55
Затем запустите инструмент переводчика типа объекта :
$ORACLE_HOME/bin/ott intype=int55_in.typ outtype=int55_out.typ hfile=int55.h user=usr/pwd code=c
, который будет генерировать два файла. В файле .pc
добавьте:
#include "int55.h"
, и ваш код должен использовать этот тип объявленной коллекции:
EXEC SQL BEGIN DECLARE SECTION;
int a;
int55 *b; /* collection type */
int c; /* single instance from collection */
OCIInd i; /* indicator */
EXEC SQL END DECLARE SECTION;
EXEC SQL ALLOCATE :b;
EXEC SQL DECLARE cdtest_cursor CURSOR FOR select a, b from rtable;
EXEC SQL open cdtest_cursor;
EXEC SQL FETCH cdtest_cursor INTO :a, :b:i;
Затем вы можете использовать COLLECTION GET
, чтобы получить отдельную элементы; так как это varray, вы можете перебирать четыре записи, например. как простое демо:
int j;
for (j = 0; j < 4; j++)
{
EXEC SQL COLLECTION GET :b INTO :c;
printf("%d %d %d\n", j, a, c);
}
EXEC SQL close cdtest_cursor;
Когда вы компилируете, вам нужно точно определить местоположение для oci.h
(включенное из сгенерированного int55.h
), если оно еще не указано; и вам нужно указать сгенерированный файл типа:
$ORACLE_HOME/bin/proc include=$ORACLE_HOME/rdbms/public intyp=int55_out.typ ...
С одной строкой в вашей таблице:
insert into rtable values (1, int55(2, 3, 4, 5));
работает, а затем получает:
0 1 2
1 1 3
2 1 4
3 1 5
Очевидно, вы должны выбрать свои собственные имена файлов, я просто использовал ваше имя типа в качестве примера, чтобы, надеюсь, сделать его более ясным. И если вам нужно обрабатывать типы mutlipel, они могут перейти в один файл _in.typ
, чтобы создать один файл _out.typ and
.h`.
Это часть новой политики Chrome относительно создания звука с веб-страниц.
Вам просто нужно, чтобы ваш пользователь предоставил пользовательский жест (для которого вы можете найти список здесь ) в течение времени жизни родительского документа (то есть событие может долго быть мертвым, пока пользователь когда-либо взаимодействовал) со страницей).
Обратите внимание, что эти события могут даже проходить через фреймы, например, в StackOverflow простой факт, что вам нужно нажать кнопку «Выполнить», сделает внутренний фрейм разрешенным для выполнения этого кода: [116 ]
const ut = new SpeechSynthesisUtterance('No warning should arise');
speechSynthesis.speak(ut);
И в своем коде вы просто должны предоставить своего рода пользовательский интерфейс, который обеспечит взаимодействие ваших пользователей со страницей. прежде чем вызывать этот метод (например, кнопка / переключатель будет отлично).